3

我是 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)
     .....

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

4

3 回答 3

1

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

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

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

于 2013-08-30T01:37:13.187 回答
0

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

于 2013-08-30T06:17:28.160 回答
-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);
} 
于 2013-08-29T17:58:21.740 回答