MVC 3 - 将复杂类型绑定到具有列表类型属性的对象

5
我有一个以下的视图模型,它将被我正在开发的搜索控件使用。
public class SearchViewModel
{
    public SearchViewModel()
    {
        SearchLocation = new SearchLocationViewModel();
        SearchCategories = new SearchCategoriesViewModel();
    }

   public SearchLocationViewModel SearchLocation { get; set; }
   public SearchCategoriesViewModel SearchCategories { get; set; }
}

现在,SearchCategoriesViewModel具有以下结构:

public class SearchCategoriesViewModel
{
    [Display(Name = "Categories")]
    public IList<SearchCategoryViewModel> Categories { get; set; }

    public SearchCategoriesViewModel()
    {
        Categories = new List<SearchCategoryViewModel>();
    }
}

最后,搜索类别视图模型具有以下结构:
    public class SearchCategoryViewModel
    {
        [Required]
        [Display(Name="Id")]
        public int Id { get; set; }

        [Display(Name="Name")]
        public String Name { get; set; }

        public bool IsSelected { get; set; }
    }

当我提交搜索请求时,SearchLocationViewModel将带有提交的参数,但是SearchCategoriesViewModel为空(不为null)。
以下是我的SearchCategoryViewModel的编辑器模板:
@model MyDLL.WebUI.Models.SearchCategoriesViewModel

@foreach (var c in Model.Categories)
{
    @Html.Label(c.Name);
    @Html.CheckBox(c.Name,c.IsSelected);
}

我使用以下视图生成搜索控件:
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true) 

    <div id="search">
        @Html.EditorFor(m => m.SearchCategories, "SearchCategory")            
        @Html.EditorFor(m => m.SearchLocation, "SearchLocation")            
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>    
}   

我最终得到了以下标记:

我最终得到了以下标记:

   <h2>Search</h2>

<form action="/Settings/Search" method="post">        


<label for="SearchCategories_Professional">Professional</label>
<input id="SearchCategories_Professional" name="SearchCategories.Professional" type="checkbox" value="true" />
<input name="SearchCategories.Professional" type="hidden" value="false" />

<label for="SearchCategories_Associate">Associate</label><input id="SearchCategories_Associate" name="SearchCategories.Associate" type="checkbox" value="true" />
<input name="SearchCategories.Associate" type="hidden" value="false" />            

        <p>
            <input type="submit" value="Create" />
        </p> 

</form>

我怀疑是由于生成的标记错误导致参数无法传递。你们之中有人尝试从复杂对象生成部分视图吗?我不想传递IEnumerable,我宁愿将其封装在一个单独的类中,以便在未来可以扩展/删除它。
谢谢。

请展示您的SearchCategory部分视图。问题与DefaultModelBinder无法绑定SearchCategories.Associate有关,因为DefaultModelBinder在SearchCategoryViewModel中找不到属性Associate。解决方案可能取决于您的部分视图。 - counsellorben
1个回答

5
由于您有一个静态列表,您可以快速地创建标记来正确绑定它。
@model MyDLL.WebUI.Models.SearchCategoriesViewModel
@{
    var i = 0;
}
@foreach (var c in Model.Categories) 
{
    @Html.Hidden("Categories[" + i.ToString() + "].Id", c.Id);
    @Html.Hidden("Categories[" + i.ToString() + "].Name", c.Name);
    @Html.Label(c.Name);
    @Html.CheckBox("Categories[" + i.ToString() + "].IsSelected",c.IsSelected);
} 

这是一个快速而不完美的解决方案。然而,我建议您重新考虑如何在局部视图中生成标记。


谢谢,这个方法可行!类别数量是动态的,因此需要某种循环。您建议我如何生成它? - user338195

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接