【问题标题】:Should I be using hidden fields to preserve model fields between Edit and Save in ASP.Net MVC?我应该使用隐藏字段来保留 ASP.Net MVC 中编辑和保存之间的模型字段吗?
【发布时间】:2013-08-29 17:37:32
【问题描述】:

我是 MVC 的新手,正在努力遵守最佳实践。

我正在使用现有数据项目为联系人创建一个编辑/保存表单,我需要将多个类一起加载并保存在一个表单上。

对于联系人,我需要加载一个人的姓名、公司详细信息、电话号码、地址字段等。这些都是数据项目中的一个单独的类,但我想在一个视图中进行编辑和保存/模型。问题是我似乎必须将所有必要的 PK 和 FK ID 作为隐藏字段放在我的视图中,感觉应该有更好的方法来做到这一点......

对于我的模型,我使用现有的数据类对象作为字段:

public class ContactEditModel 
{
     public Person PersonObjectName { get; set; }
     public Company CompanyObjectName { get; set; }
     public Address AddressObjectName { get; set; }
     ....
}

我为其中的每一个实例化一个对象并将它们加载到我的模型中,并且我想保存提交编辑视图时的任何更改。 由于我已经在现有数据项目中为这些类(以及完成工作的存储过程)提供了加载和保存方法,因此重用代码而不是指定模型上的所有字段并重新- 编写代码。 但是,如果没有在视图上声明所有隐藏字段,则 ID(个人、公司、地址等)在保存时不会保留在模型中,因此我必须在隐藏项中指定我想要保留的每个字段。

隐藏字段代码示例如下:

     @Html.HiddenFor(model => model.PersonObjectName.ID)
     @Html.HiddenFor(model => model.PersonObjectName.Version)
     @Html.HiddenFor(model => model.PersonObjectName.CompanyID)
     @Html.HiddenFor(model => model.AddressObjectName.ID)
     @Html.HiddenFor(model => model.AddressObjectName.AddressTypeID)
     @Html.HiddenFor(model => model.AddressObjectName.Version)
     .....

任何关于更好方法的想法将不胜感激。 谢谢。

【问题讨论】:

  • 你在使用强类型视图吗?
  • 是的,您需要使用隐藏文件来保留用户未输入的绑定。
  • 是的,这是一个强类型视图。

标签: c# asp.net-mvc


【解决方案1】:

这类问题的答案总是“视情况而定”,其中大部分是基于个人喜好,或者你是如何做事的。

例如,我不希望包含所有这些 ID,而是有一个父 ID,然后我可以使用它在 POST 上查找其他 ID。这意味着您只需要保存一个隐藏字段(或者甚至只是将其作为 url 的一部分,因此不需要隐藏)。在您的情况下,可能是 PersonObjectName.ID。

如果您不想进行其他查找,则可以包含这些 ID,但您需要考虑这是否是敏感信息。例如,如果有人使用 Fiddler 将 Address id 更改为其他内容会发生什么?您现在必须添加逻辑以确保不允许用户更新未链接到其 ID 的地址。

【讨论】:

    【解决方案2】:

    对于这样的事情,我通常使用 TempData。 TempData 基本上是会话,但它仅适用于一个请求。 因此,在 Edit get 方法中,我会将需要存储的任何 ID 放入 TempData 中,然后在发布表单时将它们读出。

    【讨论】:

    • 如果用户在不同的选项卡中同时编辑两个项目会发生什么?这会产生一种竞争条件,其中一个人可能会覆盖另一个人所期望的临时数据。这不是使用临时数据的好方法。
    • 哦,我使用基于正在编辑的记录的唯一名称。所以我的 tempdata 键将是 [CompanyName:"currentEditedID"] 关于使用 tempdata 作为一种机制,如果不将数据发布到客户端(这意味着它几乎可以使用 firebug / fiddle 进行编辑),您没有很多选择。您必须将其存储在服务器端。所以你只剩下会话或像 tempdata 这样更轻的东西。
    【解决方案3】:

    您可以按照以下步骤操作:

    设计模型:

    public class ContactEditModel 
    {
     public string PersonObjectName { get; set; }
     public string CompanyObjectName { get; set; }
     public string AddressObjectName { get; set; }
     ....
    }
    

    创建强类型视图:

    @model MyModels.ContactEditModel //Model Namespace
    @using (Html.BeginForm())
    {
        @Html.TextBoxFor(m => m.PersonObjectName )
        @Html.TextBoxFor(m => m.CompanyObjectName )
        @Html.TextBoxFor(m => m.AddressObjectName )
        @Html.ValidationMessageFor(m => m.Password)
        <input type="submit" value="Log In" />
    } 
    

    使用行动

    public ActionResult Edit(ContactEditModel model)
    {
         return View(model);
    }
    [HttpPost]
    public ActionResult Edit(ContactEditModel model)
    {
         // Implementation
         // model will have all updated values from UI
         return View(user);
    } 
    

    【讨论】:

    • 您的回答并没有解决他的问题,实际上您似乎根本没有阅读他的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    相关资源
    最近更新 更多