在未加载所有字段时,在强类型视图上保存数据的最佳方法

时间:2009-12-09 20:47:20

标签: asp.net-mvc vb.net post strongly-typed-view

假设我有一个强类型的编辑视图,名为“MyData”。视图有多个选项卡,每个选项卡都有几个不同的字段。为了提高性能,仅在查看选项卡时才会加载数据,因此,如果仅编辑选项卡1上的字段并提交表单,则不会加载选项卡2的数据。

我遇到的问题是提交。我正在执行查找数据库中现有记录并更新传递值的典型例程:

<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal data As MyData) As ActionResult

    Using dc = New MyDataContext
        Dim orig = dc.MyDatas.Single(Function(x) x.id = data.id)
        orig.name = data.name
        orig.desc = data.desc
        ...
        SubmitChanges()
    End Using

    Return View(orig)

End Function

但是,此方法不知道加载了哪些选项卡,因此如果未加载带有“desc”的选项卡,则此方法认为用户清空了“desc”字段,并向数据库发送NULL。

如何构造它以便只将已加载的字段发送到数据库,并忽略卸载的字段?

3 个答案:

答案 0 :(得分:1)

你有没有理由不使用UpdateModel(orig)

如果您使用的是模型绑定,而不是手动浏览表单内容并分配值,则会为您处理。默认的模型绑定行为是忽略没有相应表单值的属性。

您可能需要查看this post以及其中的链接文章,以了解有关模型绑定的更多信息。

答案 1 :(得分:0)

也许ViewModel模式可以在这里为您提供帮助,您可以将原始模型分开,例如标签视图:

public class Tab1 
    {
        public string pproperty1 { get; set; }
        public string pproperty2 { get; set; }
    }
    public class Tab2
    {
        public string pproperty3 { get; set; }
        public string pproperty4 { get; set; }
    }
    public class Tab3
    {
        public string pproperty5 { get; set; }
        public string pproperty6 { get; set; }
    }
    public class ViewModels
    {
        public Tab1 TAB1 { get; set; }
        public Tab2 TAB2 { get; set; }
        public Tab3 TAB3 { get; set; }
    }

所以,如果Tab2 == null绑定了已发布的值,那么您就知道这些属性未加载,用户也没有更改。

PD:对不起c#,这是我vb编码的时间。

答案 2 :(得分:0)

我建议为每个只更新该选项卡上的字段的选项卡设置单独的操作方法。然后,每个选项卡上的表单将提交给相应的操作。