加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC 3 – 使用List类型属性绑定到复杂类型

发布时间:2020-12-16 06:58:51 所属栏目:asp.Net 来源:网络整理
导读:我有一个以下的视图模型,它将由我正在使用的搜索控件使用. public class SearchViewModel{ public SearchViewModel() { SearchLocation = new SearchLocationViewModel(); SearchCategories = new SearchCategoriesViewModel(); } public SearchLocationView
我有一个以下的视图模型,它将由我正在使用的搜索控件使用.

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会显示为空(非空).

下面是我的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,我宁愿将它封装在一个单独的类中,以便我可以在将来扩展/删除它.

谢谢

解决方法

因为您有一个静态列表,所以您可以快速破解创建将正确绑定的标记的方法:

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

这是一个快速而丑陋的解决方案.但是,我建议您重新考虑如何在局部视图中生成标记.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读