【问题标题】:ASP.NET MVC posting list from view to controller从视图到控制器的 ASP.NET MVC 发布列表
【发布时间】:2015-06-22 14:36:49
【问题描述】:

我的 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>();
    }
}

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

@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 数据生成方式不同,我想有办法让它保持不变(就像第一张图片一样)。

不使用局部视图:

使用局部视图:

感谢您提供的任何帮助!

【问题讨论】:

    标签: c# .net asp.net-mvc razor


    【解决方案1】:

    老实说,EditorTemplate 可能是一个很好的候选者,这样你就不会遇到任何前缀问题:

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

    虽然不使用编辑器模板,但您可以使用的一种技术是在 ViewDataDictionary 内的部分声明中指定前缀,方法是:

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

    【讨论】:

    • 您好,HtmlFieldPrefix 有效,但 EditorFor 无效。
    • @GeorgeFindulov,对 typeof TechnologyFilter 使用 EditorTemplate 是正确的方法。如果它不适合您,请考虑在新问题中发布您尝试过的代码。
    • 我终于使用 EditorTemplate 完成了这项工作。感谢您的帮助。
    • @GeorgeFindulov 这是个好消息,很高兴你成功了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多