具有View Model的存储库在一个属性上返回null

时间:2013-08-15 19:22:07

标签: c# asp.net-mvc

我已经搜索了好几个小时了,但找不到我正在寻找答案的答案。我有以下内容:

(Repository.cs)

public class AppRespository
{
    private DataContext db = new DataContext();

    public IEnumerable<SelectListItem> LoadStates()
    {
        var query = from d in db.States.ToList()
                    select new SelectListItem
                    {
                        Value = d.StateID.ToString(),
                        Text = d.State.ToString()
                    };
        return query;
    }
}

DataContext.cs

public class DataContext : DbContext
{
    public DbSet<States> States { get; set; }
}

ViewModel(States.cs)

public class States
{
    [Key]
    public int StateID { get; set; }
    public IEnumerable<SelectListItem> State { get; set; }
}

Controller(ApplicantController.cs)

// GET: /Applicant/

    public ActionResult Index()
    {
        AppRespository repo = new AppRespository();
        States viewModel = new States();
        viewModel.State = repo.LoadStates();
        return View(viewModel);
    }

查看:

@Html.DropDownListFor(model=>model.StateID, Model.State, "select")

为什么在调试我的应用程序时,我在我的存储库类的这一行得到一个null?

Text = d.State.ToString(),

State始终为null,而StateID始终设置为null。在使用我的模型和控制器之前,我已成功加载此下拉列表,但我喜欢这种模式。我是ASP MVC的中间人,所以我可能会遗漏一些东西。

感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

试试这个

@Html.DropDownListFor(n => n.StateID, 
                     new SelectList(State, "Value", "Text"))

答案 1 :(得分:0)

尝试更改您的查询。而不是:

public IEnumerable<SelectListItem> LoadStates()
{
    var query = from d in db.States.ToList()
                select new SelectListItem
                {
                    Value = d.StateID.ToString(),
                    Text = d.State.ToString()
                };
    return query;
}

有这个:

public IEnumerable<SelectListItem> LoadStates()
{
    var query = from d in db.States
                select new
                {
                    StateID = d.StateID,
                    State = d.State
                };
    var result = from q in query.ToList()
                 select new SelectedListItem
                 {
                     Value = d.StateID.ToString(),
                     Text = d.State.ToString()
                 }

    return result;
}

查询的第一部分设置一个查询,以便从数据库中存储数据。它使用具有2个属性的匿名类:StateIDState

一旦查询准备就绪,我们调用query.ToList(),它实际运行查询并获取数据,然后列出我们的匿名类对象。

现在我们可以从列表中进行选择,并使用SelectedListItem或任何其他.NET方法将匿名对象中的数据转换为.ToString()

答案 2 :(得分:0)

看起来你需要在这里稍微移动一下。我对你想要达到的目标做了一些假设,但是

(Repository.cs)

public class AppRespository
{
    private DataContext db = new DataContext();

    public IEnumerable<SelectListItem> LoadStates()
    {
        var query = from d in db.States.ToList()
                    select new SelectListItem
                    {
                        Value = d.StateID.ToString(),
                        Text = d.State
                    };
        return query;
    }
}

的DbContext

public class DataContext : DbContext
{
    public DbSet<StateEntity> States { get; set; }
}

州实体

public class StateEntity
{
    [Key]
    public int StateID { get; set; }
    public string State { get; set; }
}

视图模型

public class StateModel
{
    public IEnumerable<SelectListItem> States {get; set;}
}

控制器操作

// GET:/申请人/

public ActionResult Index()
{
    AppRespository repo = new AppRespository();
    StateModel viewModel = new StateModel();
    viewModel.States = repo.LoadStates();
    return View(viewModel);
}

希望这有助于您完成大部分工作。我假设您只想使用StateEntity

加载一个int / string对列表