DropDownList对于不预先选择值

时间:2016-11-28 11:45:43

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

我正在构建一个MVC Web应用程序,并且即将开始,我已经有了十几个主题,所有人都接受了对我不起作用的解决方案。可能有些东西非常愚蠢和简单,我忘了/没有看到,但似乎无法解决。 请不要因为命名而恨我;我正在继续由其他人开始的项目。

我的ManageDetail.cshtml中有以下行:

@Html.DropDownListFor(m => m.ChecklistWaarde.SoortID, Model.ChecklistOptionsOptions, "Choose a value", new { @class = "form-control" })

这将基于属性Model.ChecklistWaarde.SoortID构建一个选择框,该属性是一个整数。传递的下一个参数是模型中的SelectList,它是由以下非常简单的辅助函数生成的,它在第二个数据库中进行数据库查找(不幸的是),它还接收参数SoortID以设置预选值:

public SelectList GetChecklistOptions(int selectedId = -1)
    {
        var soorten = new List<SelectListItem>();
        try
        {
            using (var connection = new SqlConnection(mssqlConnectionString))
            {
                connection.Open();
                SqlCommand command = connection.CreateCommand();
                command.CommandText = "Select Naam, ID From ChecklistSoorten";
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    var id = reader["ID"] as int?;
                    if (id.HasValue)
                    {
                        soorten.Add(new SelectListItem { Text = reader["Naam"] as string, Value = id.Value.ToString(), Selected = id.Value.Equals(selectedId) });
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Globals.Log.Error(ex);
        }

        return new SelectList(soorten, "Value", "Text");            
    }

它在控制器中被调用如下:

public ActionResult ManageDetail(int? id) {
    var model = new MachineDetailsModel(id);
    model.ChecklistOptionsOptions = sqlDal.GetChecklistOptions(model.ChecklistWaarde.SoortID);
    return View("ManageDetail", model); 
}

当我尝试调试代码时,我可以看到模型值已正确填充:

  • SoortID的值为2(int
  • Model.ChecklistOptionsOptions已填充SelectLis t
  • 在检查SelectList时,我发现只有值为“2”的项目具有属性Selected = true,对于所有其他项目,这是false
  • 当表单被渲染时,它不会选择值为2的项目,而是选择第一个项目,“选择一个值”
  • 检查HTML,我发现确实没有选择值为2的项目,这与我的预期相反(请参阅下面的HTML;为了便于阅读,将计数和文本中的列表缩短)。我希望在项目2的行上看到“已选中”,因为它是在SelectList中选中的。

  <select class="form-control" data-val="true" data-val-number="The field SoortID must be a number." data-val-required="The SoortID field is required." id="ChecklistWaarde_SoortID" name="ChecklistWaarde.SoortID" style="min-width:100%;">
            <option value="">Choose a value</option>
		    <option value="1">Item A</option>
		    <option value="2">Item B</option>
		    <option value="3">Item C</option>
		    <option value="4">Item D</option>
	    </select>

我错过了什么?如何选择值为“2”的项目,就像我传递给SelectList函数的DropDownListFor()一样?

2 个答案:

答案 0 :(得分:0)

在您填充SelectList的控制器中,在那里设置所选值,您的代码将如下所示:

if (id.HasValue)
{
     soorten.Add(new SelectListItem 
                    { 
                      Text = reader["Naam"] as string, 
                      Value = id.Value.ToString() 
                    });
}

然后在实例化SelectList

的行
return new SelectList(soorten, "Value", "Text",selectedId);

或者您可以放弃SelectList,而是在您的模型中将属性ChecklistOptionsOptions类型更改为List<SelectListItem>,在这种情况下,不需要创建SelectList的最后一行此外,现在您正在多次创建它。

答案 1 :(得分:0)

最终,视图中所有呈现的内容都来自ViewData。这需要模型,但也请求数据和'ModelState`。

当某些请求参数的名称与某些模型参数冲突时,我遇到了这种问题。这会覆盖模型中的值并导致问题。

调试非常困难,因为通常会显示已设置所有正确的值。如果有疑问,请检查所有参数名称。