ASP.NET MVC模型绑定到复杂对象列表中的单个属性

时间:2015-12-02 06:20:01

标签: c# asp.net-mvc-5 model-binding

.NET 4.5
ASPNET.MVC 5

在感兴趣的网页上,在复杂对象列表中,我试图只为每个复杂对象编辑一个属性。

假设我的复杂类看起来像这样:

public class MyClass
{
   [Required]
   public int MyClassID {get; set;}     // Primary Key
   [Required]
   public int Prop1 { get; set; }       // an integer property
   [Required]
   public string Prop2 { get; set; }    // a string property
   [Required]
   public EnumType Prop3 { get; set; }  // an enum property that's being changed
}

在我的表单中,我正在尝试编辑仅MyClass更改的Prop3个对象列表。

这些是我的控制器中的Get和Post方法:

[HttpGet]
public ActionResult ChangeJustProp3InList()
{
   .
   . /* some validation stuff */
   .
   var myList = new List<MyClass>
       {
          /*... some MyClass objects ...*/ 
       };
   return View(myList);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ChangeJustProp3InList(List<MyClass> myList)
{
   .
   . /* some stuff I think is unnecessary for this question */
   .
}

这是我的观点:

@model IList<MyClass>

   .
   . /* some html */
   .

@using (Html.BeginForm("ChangeJustProp3InList", "MyController", FormMethod.Post))
{
   @Html.AntiForgeryToken()
   @Html.ValidationSummary()

   for (int i = 0; i < Model.Count; i++)
   {
      Html.HiddenFor(model => Model[i].MyClassID);
      Html.HiddenFor(model => Model[i].Prop1);
      Html.HiddenFor(model => Model[i].Prop2);

      var uniqueID = "MyClass" + Model[i].MyClassID; <!-- html needs unique "id" attribute for each MyClass object -->
      Html.RadioButtonFor(model => Model[i].Prop3, EnumType.Choice1, new { id = uniqueID });
      Html.RadioButtonFor(model => Model[i].Prop3, EnumType.Choice2, new { id = uniqueID });
      Html.RadioButtonFor(model => Model[i].Prop3, EnumType.Choice3, new { id = uniqueID });
   }
   <a><input type="submit" value="Submit" class="btn btn-default center-block" /></a>
}

(上面可能存在一些与使用razor在c#和html标记之间进行相关的语法错误。请忽略这些错误,因为我试图消除尽可能多的不必要的代码。)

请注意,我是Prop3属性是使用单选按钮控件更新的枚举。

所以,目前,我能够为每个MyClass对象发布Prop3属性的任何更改。但是,每个其他属性(Prop1,Prop2,甚至MyClassID)都会重置为默认值(null,0等)。我想保留最初的值。

我正在考虑使用BindAttribute绑定如下...

public ActionResult ChangeJustProp3InList([Bind(Include = "<only Prop3>"] List<MyClass> myList)

但我在复杂类型列表中找不到任何绑定单个属性的东西。有什么想法吗?

我的问题与此处提出的问题有些相关:ASP.Net MVC - How to include / exclude binding of certain child collection / enumerable properties?

0 个答案:

没有答案