我是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)
.....
任何有关更好的方法的想法将不胜感激。 感谢。
答案 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);
}