MVC.NET - 更新模型中的EntitySet

时间:2010-11-09 21:56:00

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

我目前正在为ASP.NET MVC中的模型更新视图。该模型称为Document,并具有子链接:

[Association(ThisKey = "AssetID", OtherKey = "AssetID")]
private EntitySet<Link> links = new EntitySet<Link>();
public IQueryable<Link> Links
{
    get { return links.AsQueryable().Select(l => l); }
    set 
    {
        links.Assign(value);
    }
}

我的强类型更新表单通过EditorTemplate正确渲染模型(包括所有链接)以获取链接,然后使用Html.EditorFor(model => model.links)。这成功地抓取并显示给定文档的所有链接。

当提交表单并使用Fiddler查看回发的数据时,对于每个链接,它包含所有字段,如Links [0] .Id = 12323,Links [0] .DisplayOrder = 1等。

问题是,当我在我发布的控制器方法上放置一个断点,并检查正在发布的Document对象时,其Links集合为空。我已经尝试过添加额外的绑定属性到我的控制器,如here所述,但没有运气 - 传递给参数的参数始终为null。

当我尝试更新时,为什么我的模型不包含这些链接的任何想法?感谢

1 个答案:

答案 0 :(得分:2)

发生这种情况的原因很简单:这是因为你没有使用我推荐的视图模型。让我详细说明一下。在您的视图中,您直接使用不是POCO对象的数据模型,并使用Linq to SQL进一步使用特定于DAL的EntitySet<T>内容污染它们,只需查看Links属性的setter:{ {1}}。不要指望默认模型绑定器是那么聪明。视图不应该与links.Assign(value);之类的东西一起使用(这是一个特定于实现的细节)。

首先定义一个POCO视图模型,该模型表示编辑链接的视图的意图:

EntitySet<T>

现在强烈地将视图输入到此视图模型而不是模型。 POST操作也将视图模型作为参数。您可以使用AutoMapper在模型和视图模型之间执行转换。

事实上,每次我在使用public class MyViewModel { // As you can see the sole responsibility of the view is to // show a list of input fields for each link to be edited. // TODO: you could also have a view model for Link the same way public IEnumerable<Link> { get; set; } } asp.net-mvc(或实体框架)标记的SO上看到问题时,我都知道存在错误。这两件事应该完全分开,没有任何共同之处。您应该在存储库中抽象出DAL,以便MVC永远不会知道您正在使用的数据访问技术。

正常情况是:

控制器操作接收视图模型作为参数,验证它,将此视图模型映射到某个模型,并从传递模型的存储库调用某些方法。存储库返回另一个模型,该模型又转换为视图模型并传递给要呈现的视图(当然这是完整的场景,在某些情况下您可以跳过简单操作的步骤)。