我正在构建一个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
。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()
一样?
答案 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`。
当某些请求参数的名称与某些模型参数冲突时,我遇到了这种问题。这会覆盖模型中的值并导致问题。
调试非常困难,因为通常会显示已设置所有正确的值。如果有疑问,请检查所有参数名称。