2011-06-15 75 views
1

我被要求查看一些ASP.Net MVC代码中的错误,并对SelectList有一个(对我来说)非常奇怪的问题。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

您可以添加视图中的代码吗?您是使用Html.DropDownList还是Html.DropDownListFor? – FlyingDeveloper 2011-06-15 18:01:44

+0

Html。DropDownList正在被使用(现在也增加了问题) – glosrob 2011-06-15 18:44:12

回答

5

这段代码看起来在每个可想象的方面(当然恕我直言)是可怕的。我不知道为什么它不起作用,我不想知道。我所能做的就是向你建议如何改进它(如果你正在寻找一个关于为什么你的代码不工作的解决方案,那么你可以停止阅读这篇文章,因为我没有任何想法)。

所以第一个改进是摆脱任何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

+0

对于最近的答复道歉..我同意你上面提到的大部分 - 特别是ViewModel/ViewData部分。 Twas本来不是我的代码,可悲的是 - 我无法承受我的项目需要完全重写它的时间(有关页面上面有更多内容)...所以这在技术上是正确的回答,但不是在这个特定情况下使用的。 – glosrob 2011-06-17 18:47:03

+0

@Darin你的答案很神奇。他们总是出现,就像我将要提出一个类似的问题,与我的问题略有关联。它修复了我的问题 – Eon 2016-12-12 17:55:33

0

你可以尝试

<%: Html.DropDownList("MarketingByFax", (IEnumerable<SelectListItem>)ViewData["MarketingByFaxList"])%> 

dropdwon具有接受选择列表的类型对象的枚举过载,它会自动设置取决于列表的价值列表中的selectListItems的选定属性。为此,你必须设置

ViewData["MarketingByFaxList"] = items;//where item is IEnumerable<SelectListItem> or List<SelectListItem> as you used in your code 
相关问题