带有自定义参数的 Html.DropDownListFor()

标签 html asp.net-mvc asp.net-mvc-3 select

我想在 HTML 助手中添加扩展方法来生成这样的选择和选项

<select id="Country" name="Country">
<option data-domain="AN" value="1">Andorra</option>
<option data-domain="UI" value="2">United Arab Emirates</option>
<option data-domain="AF" value="3">Afghanistan</option>

选项有一个数据域属性,我可以这样使用它

@Html.DropDownListFor(m => m.Country, Model.CountryList)

Model.CountryList 是国家变量的数组

class Country
{
    public String Text { get; set; }
    public String Value { get; set; }
    public String Domain { get; set; }
}

谁能给个解决办法

最佳答案

您可以在自定义辅助方法的帮助下构建您的 CustomDropdownListFor,如下所示:

自定义助手方法:

public static class CustomHelpers
{    
    public class CustomSelectItem : SelectListItem
    {           
        public string Class { get; set; } 
        public string Disabled { get; set; }
        public string SelectedValue { get; set; }
    }

    public static MvcHtmlString CustomDropdownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<CustomSelectItem> list, string selectedValue, string optionLabel, object htmlAttributes = null)
    {
        if (expression == null)
        {
            throw new ArgumentNullException("expression");
        }
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
        string name = ExpressionHelper.GetExpressionText((LambdaExpression)expression);
        return CustomDropdownList(htmlHelper, metadata, name, optionLabel, list, selectedValue, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }

    private static MvcHtmlString CustomDropdownList(this HtmlHelper htmlHelper, ModelMetadata metadata, string name, string optionLabel, IEnumerable<CustomSelectItem> list, string selectedValue, IDictionary<string, object> htmlAttributes)
    {
        string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
        if (String.IsNullOrEmpty(fullName))
        {
            throw new ArgumentException("name");
        }

        TagBuilder dropdown = new TagBuilder("select");
        dropdown.Attributes.Add("name", fullName);
        dropdown.MergeAttribute("data-val", "true");
        dropdown.MergeAttribute("data-val-required", "Mandatory field.");
        dropdown.MergeAttribute("data-val-number", "The field must be a number.");          
        dropdown.MergeAttributes(htmlAttributes); //dropdown.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        dropdown.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)); 

        StringBuilder options = new StringBuilder();

        // Make optionLabel the first item that gets rendered.
        if (optionLabel != null)
            options.Append("<option value='" + String.Empty + "'>" + optionLabel + "</option>");

        foreach (var item in list)
        {
            if (item.SelectedValue == "selected" && item.Disabled == "disabled")
                options.Append("<option value='" + item.Value + "' class='" + item.Class + "' selected='" + item.SelectedValue + "' disabled='" + item.Disabled + "'>" + item.Text + "</option>");
            else if (item.SelectedValue != "selected" && item.Disabled == "disabled")
                options.Append("<option value='" + item.Value + "' class='" + item.Class + "' disabled='" + item.Disabled + "'>" + item.Text + "</option>");
            else if (item.SelectedValue == "selected" && item.Disabled != "disabled")
                options.Append("<option value='" + item.Value + "' class='" + item.Class + "' selected='" + item.SelectedValue + "'>" + item.Text + "</option>");
            else
                options.Append("<option value='" + item.Value + "' class='" + item.Class + "'>" + item.Text + "</option>");
        }
        dropdown.InnerHtml = options.ToString();
        return MvcHtmlString.Create(dropdown.ToString(TagRenderMode.Normal));
    }
}


View ( Razor ):

@Html.CustomDropdownListFor(m => m.PersonId, ViewBag.PersonData as List<CustomHelpers.CustomSelectItem>, null, "---- Select ----", 
    new { name = "personId", id = "personId"})                   
@Html.ValidationMessageFor(m => m.PersonId, null , new { @class = "ValidationErrors" })

希望这有助于...

关于带有自定义参数的 Html.DropDownListFor(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8505264/

相关文章:

html - 防止向左浮动的 div 换行

javascript - 如何使用 javascript 文件系统 api 重命名目录?

javascript - 无法读取未定义的属性 'counterHub'

javascript - 动态地将模型行添加到表中

javascript - ie9中光标跳到元素上方

html - CSS:em 值是最重要的

javascript - "float"到父 DIV 底部的 DIV 不起作用。 (使用 Pos : rel, Bottom 0 等)

asp.net-mvc - 路由约束不适用于 ASP.NET MVC

asp.net-mvc-3 - 新鲜加载页面而不是从缓存中加载

javascript - 在 ASP.NET MVC 站点中重用 Javascript 片段