【问题标题】:How do I use the [Bind(Include="")] attribute on complex nested objects?如何在复杂的嵌套对象上使用 [Bind(Include="")] 属性?
【发布时间】:2011-10-08 00:22:49
【问题描述】:

我正在创建一个锁清单,每个锁都有一个序列号 (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)
{
...
}

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 model-binding


    【解决方案1】:

    据我所知,我需要告诉它绑定到名为 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; }
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 2021-12-30
      • 2020-04-05
      相关资源
      最近更新 更多