asp.net-mvc – SelectListItem中的Selected属性永远不会起作用(DropDownListFor)

我在选择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);
    }
}

相关文章

项目要求通过网站上传大文件,比如视频文件,通过摸索实现了文件分片来上传,然后后台进行合并。 使用了...
安装新版本的Nginx(vim /etc/yum.repos.d/nginx.repo) [nginx-stable] name=nginx stable repo baseu...
什么是 SignalR&#160;ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功...
在Windows下使用Docker,我们选择Docker Desktop这个软件,非常方便。 ## Docker Desktop介绍及安装 Do...
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求...
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主...