扩展方法不工作,因为它应该
我目前正在开发使用C#和Asp.Net MVC正在开发的应用程序。扩展方法不工作,因为它应该
在其中一个用户必须选择的10 DropDowns
左右。所选值存储在数据库中。
例如:
-
DropDown
有1
Value
和Text
显示为First Main Fault
-
DropDown
有One
Value
和Text
出现First Sub Fault
现在,用户可以回来和编辑记录。所以我想向他们展示DropDown
,它已经被选中并存储在数据库中。
为此,我利用下面的扩展方法
public static IEnumerable<SelectListItem> ToSelectListItems<T>(this IEnumerable<T> items, Func<T, string> textSelector, Func<T, string> valueSelector, Func<T, bool> selecter)
{
return items.OrderBy(item => textSelector(item))
.Select(item =>
new SelectListItem
{
Selected = selecter(item),
Text = textSelector(item),
Value = valueSelector(item)
});
}
我称之为作为
var mainFaultSelectedDdl = mainFaults.ToSelectListItems(
m => m.MainFaultDescription,
m => m.Id.ToString(),
m => m.Id == mainFaultId); //mainFaultId here equals to 1. I've also tried m.Id.ToString() == mainFaultId.ToString() but still the same issue
var subFaultSelectedDdl = subFaults.ToSelectListItems(
s => s.SubFaultDescription,
s => s.SubFaultDescription,
s => s.SubFaultDescription == erst.SubFault); //erst.SubFault here equals to One
当调试我的代码,我可以看到上述两种DropDowns
Selected
被设置为True
但在视图中,未选择MainFault DropDown
,但选择了SubFault DropDown
。
有人可以告诉我哪里出错了请。
这是怎么了,我目前的Serial.MainFault
值绑定到你的财产的价值,你的情况产生DropDown
视图
@Html.DropDownListFor(m => m.Serial.MainFault, Model.MainFaultDdl, "Please select a main fault", new { id = "mainFaults", @class = "form-control main-ddl" })
@Html.DropDownListFor(m => m.Serial.SubFault, Model.SubFaultDdl, "Please select a sub fault", new { id = "subFaults", @class = "form-control main-ddl" })
模型结合的作品。如果Serial.MainFault
的值与选项值(由mainFaults
中的对象的Id
属性的值定义)中的一个匹配,则将选择它。如果它不匹配一个值,那么第一个选项将被选中,因为必须是。
设置的SelectListItem
的Selected
属性使用DropDownListFor()
方法时,因为内部的方法建立自己的IEnumerable<SelectListItem>
并基于你的绑定到该属性的值Selected
属性忽略(注意,有一个例外 - 在如this answer所述的循环中使用DropDownListFor()
的情况)。
但是,您的扩展方法似乎并不必要,因为MVC已经有一种方法可以使用SelectList构造函数之一构建IEnumerable<SelectListItem>
。
根据您所显示的代码,你的GET方法可以简单地
var model = new YourModel();
model.Serial.MainFault = mainFaultId; // set the value to be displayed initially
model.MainFaultDdl = new SelectList(mainFaults, "Id", "MainFaultDescription"); // generate the options
return View(model);
或者您可以使用以下方法来生成选项
model.MainFaultDdl = mainFaults.Select(x => new SelectListItem()
{
Value = x.Id.ToString(),
Text = x.MainFaultDescription
};
,并会显示正确的选项在视图中。
谢谢你。 – Code
你是如何在视图中生成你的下拉列表的。当你绑定到模型 –
,你在哪里设置'mainFaultId'和'erst.SubFault'的值,设置'SelectListItem'的'Selected'属性会被忽略? – HimBromBeere
@StephenMuecke我已经更新了我的问题以包含视图中的代码。它适用于一个而不是另一个,这就是我困惑 – Code