如何在复杂的嵌套对象上使用 [Bind(Include= " " )] 属性?



我正在创建一个锁的清单,每个锁有一个序列号(Title),一个相关的学校(SchoolCode)和5个相关的组合(有number, Combination和IsActive)。我们使用Ncommon和linq,并将它们设置为嵌套实体(锁有许多组合)。

在表单上,我使用JQuery模板来动态构建表单。其中学校代码和标题是基本的表单元素,组合[索引]。数字和组合[索引]。组合是子元素。

<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)
{
...
}

从我可以告诉我需要告诉它绑定到一个名为组合的锁的属性,从那里我不能进一步选择包括或排除属性绑定到子对象。相反,我需要在Domain模型对象本身上指定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; }
        }
    }
}

最新更新