MVC 3 @ Html.DropDownListFor模型绑定失败

时间:2012-11-20 14:19:58

标签: asp.net-mvc-3 model-binding html.dropdownlistfor

我正在使用VS 2010与MVC 3和EF 5.我正在使用下拉列表的通用模式,除了一个实例之外的所有实例都能正常工作,我无法理解为什么这个模式未能在选择列表中选择正确的条目。以下是代码片段。

选择列表创建如下:

   public static IEnumerable<SelectListItem> GetOutcomes()
    {
        CodesEntities dataContextCodes = new CodesEntities(ConnectionString);

        return new SelectList(dataContextCodes.CodeOutcome.
            Where(x => x.DisplayOrder > 0).OrderBy(x => x.DisplayOrder), 
            "OutcomeCodeID", "Outcome");
    }

返回正确的选择列表。

该视图包含以下代码:

@Html.DropDownListFor(m => m.OutcomeCodeID,
                PerintalFormViewModels.GetOutcomes(), "Please select an item")

模型值m.OutcomeCodeID具有有效值(1),但未选择任何项目。

生成的HTML是:

<select id="CodeID" name="OutcomeCodeID" data-val-required="Outcome is required" data-val-number="The field outcome must be a number." data-val="true">
<option value="">Please select an item</option>
<option value="1">Termination</option>
<option value="2">Loss</option>
<option value="3">Still</option>
<option value="4">Live</option>
</select>

我在头发撕裂,被驱赶坚果阶段。有没有人有任何想法?

由于

2 个答案:

答案 0 :(得分:1)

你可以这样做:

public static IEnumerable<SelectListItem> GetOutcomes(string selectedID)
{
    CodesEntities dataContextCodes = new CodesEntities(ConnectionString);


    return new SelectList(dataContextCodes.CodeOutcome.
        Where(x => x.DisplayOrder > 0).OrderBy(x => x.DisplayOrder), 
        "OutcomeCodeID", "Outcome"
        , selectedID); // add this parameter
}

或者这个:

public static IEnumerable<SelectListItem> GetOutcomes(string selectedID)
{
    CodesEntities dataContextCodes = new CodesEntities(ConnectionString);


    return        
      dataContextCodes.CodeOutCome
      .Where(x => x.DisplayOrder > 0)
      .OrderBy(x => x.DisplayOrder)
      .ToList()
      .Select(x => new SelectListItem 
      { 
          Value = x.OutcomeCodeID.ToString(),
          Text = x.Outcome.ToString(),
          Selected = x.OutcomeCodeID == selectedID
      });
}

然后这样称呼:

@Html.DropDownListFor(m => m.OutcomeCodeID,
            PerintalFormViewModels.GetOutcomes(Model.OutcomeCodeID), 
            "Please select an item")

答案 1 :(得分:0)

您没有在任何地方设置默认选定值。

您用于SelectList的特定构造函数是这样的:

public SelectList(
    IEnumerable items,
    string dataValueField,
    string dataTextField
)

其中未设置默认值。要么你使用这个:

public SelectList(
    IEnumerable items,
    string dataValueField,
    string dataTextField,
    Object selectedValue
)

并指定 selectedValue 或者在要选择的项目上手动将SelectedListItem的Selected属性设置为true(http://msdn.microsoft.com/en-us/library/system.web .mvc.selectlistitem(v = vs.108)的.aspx)。

这是一个无耻的插件,但我认为这是一个很好的资源:http://blinkingcaret.wordpress.com/2012/08/11/using-html-dropdownlistfor/