扩展方法不工作,因为它应该

问题描述:

我目前正在开发使用C#和Asp.Net MVC正在开发的应用程序。扩展方法不工作,因为它应该

在其中一个用户必须选择的10 DropDowns左右。所选值存储在数据库中。

例如:

  1. DropDown1ValueText显示为First Main Fault
  2. DropDownOneValueText出现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 

当调试我的代码,我可以看到上述两种DropDownsSelected被设置为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" }) 
+0

你是如何在视图中生成你的下拉列表的。当你绑定到模型 –

+0

,你在哪里设置'mainFaultId'和'erst.SubFault'的值,设置'SelectListItem'的'Selected'属性会被忽略? – HimBromBeere

+0

@StephenMuecke我已经更新了我的问题以包含视图中的代码。它适用于一个而不是另一个,这就是我困惑 – Code

模型结合的作品。如果Serial.MainFault的值与选项值(由mainFaults中的对象的Id属性的值定义)中的一个匹配,则将选择它。如果它不匹配一个值,那么第一个选项将被选中,因为必须是。

设置的SelectListItemSelected属性使用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 
}; 

,并会显示正确的选项在视图中。

+0

谢谢你。 – Code