簡體   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