我在选择DropDownList的值时遇到问题.我一直在阅读所有类似的帖子,我无法得到解决方案.
实际的方法对我来说似乎非常好,因为我可以检查SelectList中的字段:
- var selectList = new List<SelectListItem>(
- from variable in someKindOfCollection
- select new SelectListItem
- {
- Selected = variable.Property == selection,Text = variable.Property,Value = variable.Property
- });
据说,这给了我完全的控制权.在构建了selectList之后,我可以使用调试器检查变量.一切都很好,其中一个标有“Selected”属性.
然后我使用DropDownListFor来显示视图:
- @Html.DropDownListFor(
- g => g.SomePropertyInModel,selectList,new { @class = "cssClass" })
但它没有用,从来没有…“渲染”下拉列表,但没有选择任何东西.
非常感谢 :)
新例子
首先,我想道歉.我一直在隐藏信息,当然是完全无意的.
所有代码都发生在Razor For循环中:
- @foreach (var loopVariable in Model.Collection)
- {
- if (Model.SomeCondition != null)
- {
- selection = someValue;
- }
- var selectList = new List<SelectListItem>(
- from variable in someKindOfCollection
- select new SelectListItem
- {
- Selected = variable.Property == selection,Value = variable.Property
- });
- @Html.DropDownListFor(
- g => g.SomePropertyInModel,new { @class = "cssClass" })
- }
那么,selectList是导致行为的局部变量的事实?对不起,我没想到就是这样.
解决方法
我认为你遇到了同样的问题.我查看了源代码以找到我的解决方案,看起来这对我来说是一个错误.下面的DropDownListFor应该有帮助,关键是你将选中的值传递给html帮助器.希望这可以帮助.
- public static class SelectExtensions {
- public static IHtmlString DropDownListFor<TModel,TProperty>(this HtmlHelper<TModel> helper,Expression<Func<TModel,TProperty>> expression,IEnumerable<SelectListItem> selectList,string selectedValue,string optionLabel,object htmlAttributes = null) {
- return DropDownListHelper(helper,ExpressionHelper.GetExpressionText(expression),selectedValue,optionLabel,htmlAttributes);
- }
- /// <summary>
- /// This is almost identical to the one in ASP.NET MVC 3 however it removes the default values stuff so that the Selected property of the SelectListItem class actually works
- /// </summary>
- private static IHtmlString DropDownListHelper(HtmlHelper helper,string name,object htmlAttributes) {
- name = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
- // Convert each ListItem to an option tag
- var listItemBuilder = new StringBuilder();
- // Make optionLabel the first item that gets rendered
- if (optionLabel != null)
- listItemBuilder.AppendLine(ListItemToOption(new SelectListItem() { Text = optionLabel,Value = String.Empty,Selected = false },selectedValue));
- // Add the other options
- foreach (var item in selectList) {
- listItemBuilder.AppendLine(ListItemToOption(item,selectedValue));
- }
- // Now add the select tag
- var tag = new TagBuilder("select") { InnerHtml = listItemBuilder.ToString() };
- tag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
- tag.MergeAttribute("name",name,true);
- tag.GenerateId(name);
- // If there are any errors for a named field,we add the css attribute
- ModelState modelState;
- if (helper.ViewData.ModelState.TryGetValue(name,out modelState)) {
- if (modelState.Errors.Count > 0)
- tag.AddCssClass(HtmlHelper.ValidationInputCssClassName);
- }
- // Add the unobtrusive validation attributes
- tag.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(name));
- return tag.ToHtmlString(TagRenderMode.Normal);
- }
- private static string ListItemToOption(SelectListItem item,string selectedValue) {
- var tag = new TagBuilder("option") { InnerHtml = HttpUtility.HtmlEncode(item.Text) };
- if (item.Value != null)
- tag.Attributes["value"] = item.Value;
- if ((!string.IsNullOrEmpty(selectedValue) && item.Value == selectedValue) || item.Selected)
- tag.Attributes["selected"] = "selected";
- return tag.ToString(TagRenderMode.Normal);
- }
- }