ASP.NET MVC2,LINQ-TO-SQL关系实体,选择列表,模型绑定

时间:2010-11-25 03:14:08

标签: asp.net-mvc linq-to-sql

假设您有以下情况:

  • 表:国家;列:CountryID,CountryName
  • 表:国家;列:StateID,StateName,CountryID(外键)
  • 表:地点;列:LocalityID,LocalityName,StateID(外键)

在MVC中,自动生成的LINQ-TO-SQL类可以映射代码中的关联关系,这样就可以调用链接的外部实体,例如:在我看来,我可以:

<% foreach (var locality in Model.Localities) { %>

    <tr>
        <td>
            <%: locality.LocalityName %>
        </td>
        <td>
            <%: locality.State.StateName %>
        </td>
        <td>
            <%: locality.State.Country.CountryName %>
        </td>
    </tr>

<% } %>

当我浏览索引操作时,这会成功呈现。

但是,我遇到了编辑操作的问题。这是代码:

        <strong>Locality Name</strong>
        <div class="editor-field">
            <%: Html.TextBox("LocalityName", Model.Locality.LocalityName) %>
            <%: Html.ValidationMessage("LocalityName")%>
        </div>

        <strong>Country</strong>
        <div class="editor-field">
            <%= Html.DropDownList("CountryID", Model.CountriesDDL, "-- select --") %>
        </div>

        <strong>State</strong>
        <div class="editor-field">
            <%= Html.DropDownList("StateID", Model.StatesDDL, "-- select--") %>
            <%: Html.ValidationMessage("StateID")%>
        </div>

首先,我在州的选择列表(对于StateID)旁边收到验证错误,例如“8不是有效值”。所以它没有更新。

我理解,通过阅读一些帖子(such as this one),通过设置ID来更新关系存在数据库相关问题,而解决方案似乎是设置ENTITY。 (顺便提一下,相反的建议也被分发here)。按照这个建议,我一直在查看Html.DropDownList()的重载,将列表项的“值”设置为对象本身,同时将“text”属性设置为Object.Name - 我还没有解决这个问题然而。但随着这项工作变得越来越耗时,我非常感谢一些专家的建议。

因此,我的问题是:如果我这样做,这实际上会起作用吗?是否有可能让SelectList以这种方式工作(以及如何建议?)

感谢您的时间,

2 个答案:

答案 0 :(得分:0)

一般情况下,将域模型传递给View也不是一个好主意(列表视图可能除外)。

更好地使用(代理)ViewModel,它是域模型的扁平化版本。这是一个更多的工作,但工作就像一个魅力。

答案 1 :(得分:0)

尝试使用此代码填充列表,它适用于我。在这里,我正在使用产品。

           <%:Html.DropDownListFor(m => m.Id, new SelectList(Model.Categories, "Id", "Name", Model.Product.CategoryId, "-Select-")%>

使用DTO显示类似内容的列表。实体可用于创建,更新,删除