繁体   English   中英

从视图到控制器的ASP.NET MVC投递列表

[英]ASP.NET MVC posting list from view to controller

我的ASP.NET MVC应用程序中有一个视图模型:

public class FiltersViewModel
{
    public IEnumerable<SelectListItem> AvailableFilters { get; set; } // fills a drop down menu

    public IList<TechnologyFilter> TechnologyFilters { get; set; }
    public IList<ContractTypeFilter> ContractTypeFilters { get; set; }

    public FiltersViewModel()
    {
        this.TechnologyFilters = new List<TechnologyFilter>();
        this.ContractTypeFilters = new List<ContractTypeFilter>();
    }
}

然后在我的控制器中,从下拉菜单中选择选定的值,并创建一个特定的过滤器对象(Technology或ContractType过滤器),然后返回View,其中具有以下代码:

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
    @Html.AntiForgeryToken()

    @Html.DropDownListFor(m => m.SelectedFilterId, Model.AvailableFilters)

    if (Model.TechnologyFilters != null)
    {
        @for (int i = 0; i < Model.TechnologyFilters.Count; i++)
        {
            <div id="technologyFilter">
            @Html.HiddenFor(m => m.TechnologyFilters[i].Name)
            @Html.DisplayFor(m => mTechnologyFilters[i].Name)
            </div>
        }
    }  
}

如果以这种方式完成了HTML标记,并且视图模型已从服务器发布回去,则视图模型将正确填充TechnologyFilters列表。 但是,当我在局部视图中提取for循环时,数据停止正确地回发并且我的TechnologyFilters列表为空:

相同的视图,但是这次调用了局部视图:

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
     @Html.AntiForgeryToken()

     @Html.DropDownListFor(m => m.SelectedFilterId, Model.AvailableFilters)

     if (Model.TechnologyFilters != null)
     {
         Html.RenderPartial("_TechnologyFilters", Model.TechnologyFilters);
     }

_TechnologyFilters.cshtml部分视图:

@model List<MVCFilters.Models.TechnologyFilter>

<div id="technologyFilters">
    @for (int i = 0; i < Model.Count; i++)
    {
        <div id="technologyFilter">
           @Html.HiddenFor(m => m[i].Name)
           @Html.DisplayFor(m => m[i].Name)
        </div>
    }
</div>

在这两种情况下,HTML数据的生成方式不同,我希望有一种方法可以使其保持恒定(就像第一张图片一样)。

不使用部分视图: 在此处输入图片说明

使用局部视图: 在此处输入图片说明

感谢您提供的任何帮助!

老实说,这可能是一个好用的EditorTemplate候选人,这样您就不会在前缀方面遇到任何问题:

@Html.EditorFor(m => m.TechnologyFilters)

但是,无需使用编辑器模板,可以使用的一种方法是通过执行以下操作在ViewDataDictionary中的部分声明中指定前缀:

Html.RenderPartial("_TechnologyFilters", Model.TechnologyFilters, new ViewDataDictionary
{
   TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "TechnologyFilters" }
}))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM