我被要求查看一些ASP.Net MVC代码中的错误,并且(对我来说)SelectList有一个非常奇怪的问题。
来自控制器的代码生成项(返回SelectList的方法,总共有5个)。然后将每个SelectList保存到ViewData集合中。
List<SelectListItem> items = new List<SelectListItem>();
string yesText = "Yes";
string noText = "No";
if (ci.LCID.Equals((int)LanguageCodes.FRANCE))
{
yesText = "Oui";
noText = "Non";
}
SelectListItem yesItem = new SelectListItem();
yesItem.Text = yesText;
yesItem.Value = ((int)MarketingBy.Yes).ToString();
yesItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(yesItem.Value));
SelectListItem noItem = new SelectListItem();
noItem.Text = noText;
noItem.Value = ((int)MarketingBy.No).ToString();
noItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(noItem.Value));
items.Add(yesItem);
items.Add(noItem);
return new SelectList(items, "Value", "Text", yesItem.Selected ? yesItem.Value : noItem.Value);
创作时的快速“快速观察”表明一切正常: Select List generated http://i52.tinypic.com/x3hd3r.png
在渲染视图时,值仍然可以正常显示。但是,加载视图时,列表中的第一项是始终选中。生成的HTML是:
<tr>
<td>Fax</td>
<td>
<select id="MarketingByFax" name="MarketingByFax">
<option value="134300002">Yes</option>
<option value="134300001">No</option>
</select>
</td>
</tr>
(为清楚起见,省略了其他值。)
有什么想法吗?还是研究途径?作者坚持认为这是“直到上周”(我不知道哪种方式)。
编辑:视图代码 -
<td><%: Html.DropDownList("MarketingByFax", (SelectList)ViewData["MarketingByFaxList"])%></td>
答案 0 :(得分:6)
这个代码在每个可以想象的方面看起来都很可怕(当然是恕我直言)。我不知道为什么它不起作用,我不想知道。我所能做的只是建议你如何改进它(所以你可以停止阅读这篇文章,如果你正在寻找一个解决方案,解释为什么你的代码不起作用,因为我没有任何怪异的想法)。
因此,第一个改进是摆脱任何ViewData
并引入视图模型:
public class MyViewModel
{
public string SelectedValue { get; set; }
public IEnumerable<SelectListItem> Items { get; set; }
}
然后我会有一个控制器动作来填充这个视图模型:
public ActionResult Index()
{
var model = new MyViewModel
{
// I want to preselect the second value
SelectedValue = "No",
Items = new[]
{
new SelectListItem { Value = "Yes", Text = "yeap !" },
new SelectListItem { Value = "No", Text = "nope !" },
}
};
return View(model);
}
在我的强类型视图中,我只是将帮助器绑定到视图模型:
<%= Html.DropDownListFor(
x => x.SelectedValue,
new SelectList(Model.Items, "Value", "Text")
) %>
此外,如果您想使用某些枚举类型,您可能会发现following extension method有用。
看看它有多容易?不再使用ViewData
进行丑陋的演员表,不再需要定义任何列表并指定一些复杂的条件,......
备注:再一次,这些只是我的2¢,你可以继续与ViewData
作战。
答案 1 :(得分:0)
你可以尝试
<%: Html.DropDownList("MarketingByFax", (IEnumerable<SelectListItem>)ViewData["MarketingByFaxList"])%>
dropdwon有一个重载,它接受Selectlist类型对象的枚举,并根据列表中selectListItems的Selected属性自动设置list的值。为此你必须设置
ViewData["MarketingByFaxList"] = items;//where item is IEnumerable<SelectListItem> or List<SelectListItem> as you used in your code