我应该在ASP.NETMVC中使用隐藏字段来保留Edit和Save之间的模型字段吗
本文关键字:字段 Save Edit 之间 模型 保留 NETMVC ASP 我应该 隐藏 | 更新日期: 2023-09-27 18:29:43
我是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);
}