Как использовать атрибут [Bind (Include = "")] для сложных вложенных объектов?
Я создаю инвентарь блокировок, каждый замок имеет серийный номер (Title), ассоциированную школу (SchoolCode) и 5 связанных комбинаций (имеющих Number, Combination и IsActive). Мы используем Ncommon и linq и устанавливаем их как вложенные объекты (Lock имеет множество комбинаций).
В форме я использую JQuery Templates для динамического создания формы. Где 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)
{
...
}
Ответы
Ответ 1
Из того, что я могу сказать, мне нужно сказать ему, чтобы он привязывался к свойству блокировки "Комбинации", оттуда я не могу далее включать или исключать свойства для привязки на под-объект. Вместо этого мне нужно будет указать атрибут bind на самом объекте модели домена.
[HttpPost]
public ActionResult Add([Bind(Include = "SchoolCode,Title,Combinations")] LockerLock @lock, [Range(1, 5)] int ActiveCombination)
{
...
}
Атрибут Bind затем включается в объект Комбинация...
[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; }
}
}
}