簡體   English   中英

如何在模型包含下拉列表的mvc.net中綁定模型?

[英]How to bind a model in mvc.net where the model contains a list of dropdowns?

如果我有一個具有以下結構的ViewModel:

public class FormViewModel
{
    public string Name { get; set; }
    public List<OptionGroup> Options { get; set; }
    public string Comments { get; set; }
}

public class OptionGroup
{
    public string OptionType;
    public IEnumerable<SelectListItem> Options { get; set; }
    public string SelectedOption;
}

我想發布到具有如下簽名的Controller方法:

    [HttpPost]
    public ActionResult PostForm(FormViewModel model)
    {
        // do stuff
    }

如何在剃須刀中綁定SelectList,以便在將其發送回服務器時正確綁定所選值?

我的第一個直覺是嘗試:

        foreach (OptionGroup optionGroup in Model.Options)
        {
            <div class="form-group">
                <label>@optionGroup.OptionType</label>
                @Html.DropDownListFor(m => optionGroup.SelectedOption, optionGroup.Options, optionGroup.OptionType, new { @class = "form-control" })
            </div>
        }

但這導致根本沒有任何選項返回到服務器。

然后,我找到了Scott Hanselman的這篇文章:

http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

並嘗試使用for循環:

        for (int i = 0; i < Model.Options.Count; i++)
        {
            <div class="form-group">
                <label>@Model.Options[i].OptionType</label>
                @Html.DropDownListFor(m => m.Options[i].SelectedOption, Model.Options[i].Options, Model.Options[i].OptionType, new { @class = "form-control", name = string.Format("model.Options[{0}].SelectedOption", i) })
            </div>
        }

這將綁定選項列表,但無法填充所選值。 (即,我在服務器上獲得了一個選項列表,但是選項的所有屬性均為Null)

我能找到的所有示例都使用一個簡單的可枚舉作為整個視圖模型-當下拉列表只是完整ViewModel的一部分時,如何綁定到下拉列表?

任何指針都很棒,

干杯!


編輯

相關: 我如何使用也發送鍵值的MVC.Net對“ List <SelectItem>”的列表進行綁定建模

並考慮到Stephen Muecke的回答,我嘗試過:

        for (int i = 0; i < Model.Options.Count; i++)
        {
            <div class="form-group">
                <label>@Model.Options[i].OptionType</label>
                @Html.HiddenFor(m => Model.Options[i].OptionType)
                @Html.DropDownListFor(m => m.Options[i].SelectedOption, Model.Options[i].Options, Model.Options[i].OptionType, new { @class = "form-control" })
            </div>
        }

但仍然沒有運氣:(

從方法中刪除以下內容

.. name = string.Format("model.Options[{0}].SelectedOption", i) ..

@Html.DropDownList()方法將為您正確命名選擇,即

<select name="Options[0].SelectedOption" ...>
<select name="Options[1].SelectedOption" ...>
// etc

但您是“模特”。 以便名稱在回發時不匹配

您的OptionGroup屬性也缺少訪問器

public class OptionGroup
{
  public string OptionType { get; set; } // add get/set
  public IEnumerable<SelectListItem> Options { get; set; }
  public string SelectedOption { get; set; } // add get/set
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM