我应该使用隐藏字段来保存ASP.Net MVC中的编辑和保存之间的模型字段吗?

时间:2013-08-29 17:37:33

标签: c# asp.net-mvc

我是MVC的新手,并且正在尝试遵循最佳做法。

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

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

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

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

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

隐藏字段代码示例如下:

     @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)
     .....

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

3 个答案:

答案 0 :(得分:1)

这类问题的答案始终是“它取决于”,其中大部分是基于个人偏好,或者你是如何做事的。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

设计模型:

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