2011-07-18 10 views
13

Tworzę spis zamków, każdy zamek ma numer seryjny (tytuł), powiązaną szkołę (SchoolCode) i 5 powiązanych kombinacji (mających numer, kombinację i isActive). Używamy Ncommon i linq i ustawiliśmy je jako zagnieżdżone elementy (Lock Has Many Combinations).Jak używać atrybutu [Bind (Include = "")] w złożonych obiektach zagnieżdżonych?

W formularzu używam szablonów JQuery do dynamicznego budowania formularza. Gdzie SchoolCode i Title są podstawowymi elementami formularza, Kombinacje [index] .Liczba i kombinacje [indeks] .Kombinacja to podelementy.

<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> 

Po uruchomieniu tego bez atrybutów wiązania powiązanie modelu działa poprawnie. Po dodaniu powiązania nie wydaje mi się, aby wiązał się z którymkolwiek z Kombinacji.

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

Odpowiedz

6

Z tego co mogę powiedzieć, muszę powiedzieć go do związania własności zamkiem zwanym Kombinacje, a stamtąd dalej nie mogę wybrać, aby włączyć lub wyłączyć właściwości wiązania na sub-object. Zamiast tego musiałbym określić atrybut wiązania w samym obiekcie modelu domeny.

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

atrybut Bind zostaje zawarte na obiekcie kombinację ...

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

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

Dla spójności I pewnie właśnie to bind na oryginalnym modelu zamka ...

Dla kontrastu, oto moje ostateczne rozwiązanie. Właśnie dodałem atrybut BindAttribute do modelu domeny w obu przypadkach:

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; } 
     } 

    } 
} 
Powiązane problemy