web-dev-qa-db-ja.com

複雑なネストされたオブジェクトで[Bind(Include = "")]属性を使用するにはどうすればよいですか?

ロックのインベントリを作成しています。各ロックには、シリアル番号(Title)、関連する学校(SchoolCode)、および5つの関連する組み合わせ(Number、Combination、およびIsActive)があります。 Ncommonとlinqを使用しており、それらをネストされたエンティティとして設定しています(Lock Has ManyCombinations)。

フォームでは、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)
{
...
}
16
Lucent Fox

私が言えることから、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; }
        }

    }
}
7
Lucent Fox