Asp.net
如何在復雜的嵌套對像上使用 [Bind(Include=’’)] 屬性?
我正在創建一個鎖清單,每個鎖都有一個序列號(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; } } } }