Asp.net

如何在復雜的嵌套對像上使用 [Bind(Include=’’)] 屬性?

  • July 18, 2011

我正在創建一個鎖清單,每個鎖都有一個序列號(Title)、一個關聯的學校(SchoolCode)和 5 個關聯的組合(具有 Number、Combination 和 IsActive)。我們正在使用 Ncommon 和 linq 並將它們設置為嵌套實體(Lock Has Many Combinations)。

在表單上,我使用 JQuery 模板來動態建構表單。其中 SchoolCode 和 Title 是基本表單元素, Combinations[index].Number 和 Combinations[index].Combination 是子元素。

<form method="post" action="/Lockers.aspx/Locks/Add">     
<input type="hidden" name="SchoolCode" value="102">  
Lock S/N: <input type="text" name="Title" value=""><br>     
<div id="combinations">
<input type="hidden" name="Combinations[0].Number" value="1">  
<input type="text" name="Combinations[0].Combination" value=""> 
<input type="radio" value="1" name="ActiveCombination"><br>
<input type="hidden" name="Combinations[1].Number" value="2">  
<input type="text" name="Combinations[1].Combination" value="">  
<input type="radio" value="2" name="ActiveCombination"><br>
<input type="hidden" name="Combinations[2].Number" value="3">  
<input type="text" name="Combinations[2].Combination" value=""> 
<input type="radio" value="3" name="ActiveCombination"><br>
<input type="hidden" name="Combinations[3].Number" value="4"> 
<input type="text" name="Combinations[3].Combination" value=""> 
<input type="radio" value="4" name="ActiveCombination"><br>
<input type="hidden" name="Combinations[4].Number" value="5"> 
<input type="text" name="Combinations[4].Combination" value="">
 <input type="radio" value="5" name="ActiveCombination"><br></div>
  <input type="submit" id="add" value="Add »"> <br>   
</form>

當我在沒有 Bind 屬性的情況下執行它時,模型綁定可以正常工作。添加綁定後,我似乎無法將其綁定到任何組合。

[HttpPost]
public ActionResult Add([Bind(Include = "SchoolCode,Title,Combinations.Combination,Combination.Number,Combinations[2].Combination")] LockerLock @lock, [Range(1, 5)] int ActiveCombination)
{
...
}

據我所知,我需要告訴它綁定到名為 Combinations 的鎖的屬性,從那裡我無法進一步選擇包含或排除要綁定到子對象的屬性。相反,我需要在域模型對象本身上指定綁定屬性。

[HttpPost]
public ActionResult Add([Bind(Include = "SchoolCode,Title,Combinations")] LockerLock @lock, [Range(1, 5)] int ActiveCombination)
{
...
}

然後將 Bind 屬性包含在 Combination 對像中…

[Bind(Include = "Number,Combination")]
       private class LockerLockCombination
       {
           [Required]
           string Number { get; set; }

           [Required]
           string SchoolCode { get; set; }
       }

為了保持一致性,我可能只會在原始鎖模型中包含綁定…

只是為了對比,這是我的最終解決方案。在這兩種情況下,我只是將 BindAttribute 添加到域模型中:

namespace Project.Web.Models
{
   [MetadataType(typeof(LockerLock.Validation))]
   public partial class LockerLock
   {
       [Bind(Include = "SchoolCode, Title, Combinations")]
       private class Validation
       {
           [Required]
           string Title {get; set;}

           [Required]
           string SchoolCode {get; set;}
       }

   }
}

namespace Project.Web.Models
{
   [MetadataType(typeof(LockerLockCombination.Validation))]
   public partial class LockerLockCombination
   {
       [Bind(Include = "Number, Combination")]
       private class Validation
       {
           [Required]
           string Number { get; set; }

           [Required]
           string Combination { get; set; }
       }

   }
}

引用自:https://stackoverflow.com/questions/6739012