【问题标题】:Repository w/ View Model returning null on one property带有视图模型的存储库在一个属性上返回 null
【发布时间】:2013-08-16 07:15:13
【问题描述】:

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

(存储库.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; }
}

控制器(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")

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

Text = d.State.ToString(),

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

感谢任何帮助。

【问题讨论】:

  • 您可以发布States 实体的代码吗?在您的 EF 查询中,它可能是一个简单的 .Include(x =&gt; x.State)
  • @chappoo 上面我的状态实体的代码就是我所拥有的。我以为我肯定在实施这一点,现在我开始怀疑自己了。我做 EF 查询的唯一地方是在我的 AppRepository.cs 类中。
  • 用 d 了解你的意图会很有用。国有财产。看起来您希望它是一个字符串,但它是一个 IEnumerable。此外,为所需视图定义数据 poco 和适当的视图模型也是正常的
  • @chappoo:是的,我希望它是一个字符串。我敢打赌,这就是我产生困惑的地方。我会看看这里提供了什么。

标签: c# asp.net-mvc


【解决方案1】:

看起来你需要在这里移动一些东西。我正在对您想要实现的目标做出一些假设,但是

(存储库.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;
    }
}

数据库上下文

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 对列表

【讨论】:

  • 我一定会看看这个例子。我显然误解了这种方法。
  • 谢谢,我终于搞定了。这是我没想到的又一层。
【解决方案2】:

试试这个

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

【讨论】:

  • 试过了,但在我的存储库类的 State 属性上仍然出错。
【解决方案3】:

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

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(),它实际运行查询并获取数据,然后制作我们的匿名类对象列表。

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

【讨论】:

  • 如果我如前所述更改查询,我得到:LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且此方法无法转换为存储表达式。我昨天对此进行了谷歌搜索,建议在国家的数据库调用之后调用 ToList。出于某种原因,我的视图模型的 State 属性没有被我的存储库中的实体框架拉入。如果我在它(字符串)上切换该数据类型,它会。但这肯定适用于当前的视图模型方法。
  • SelectedListItem 是您的类型还是内置类型?通常你会有一个实体类(从数据库中获取数据)和一个模型类(以你需要的方式转换和呈现数据)。我会用一个例子来修改我的答案。
  • SelectedListItem 将是内置类型。有一个获取/设置状态视图模型的实体类(DataContext.cs),拉回StateID ok。我猜我没有完全听从你的说法。
  • 嗯...使用您的代码我得到:LINQ to Entities 不支持指定的类型成员“状态”。仅支持初始化程序、实体成员和实体导航属性。这是因为它是一个属性类型 SelectListItem?我也会看看这个错误。感谢您的帮助。
  • 是的,正因为如此。但是它是如何存储在数据库中的呢?只是为了澄清:在数据库中,您有一个带有 int 列(StateID)的表。 State(即StateListItem)是如何存储的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多