我应该在ASP.NETMVC中使用隐藏字段来保留Edit和Save之间的模型字段吗



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

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

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

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

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

我为其中的每一个实例化一个对象,并将它们加载到我的模型中,并且我希望在提交Edit视图时保存任何更改。由于我在现有的数据项目中已经有了这些类的加载和保存方法(以及完成这项工作的存储过程),因此重用代码似乎是有意义的,而不是指定模型上的所有字段并重新编写代码。但是,如果不在视图中声明所有隐藏字段,保存时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)
     .....

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

这类问题的答案总是"取决于",其中很大一部分是基于个人偏好,或者你是如何做事的。

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

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

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

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

设计模型:

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" />
} 

使用Action

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);
} 

相关内容

最新更新