如何在这个HtmlHelper中添加htmlAttributes?

时间:2013-01-14 04:52:49

标签: c# asp.net .net asp.net-mvc-4 html-helper

我正在使用this code来使用MVC4实现RadioButtonList。

正如您所看到的,该函数没有htmlAttributes参数。所以我想添加它,这就是问题所在。请检查RadioButtonFor()的htmlAttributes是否被id占用。

我试图添加它但是却抛出了错误,因为循环中已存在id。

public static class HtmlExtensions
{
    public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        IEnumerable<SelectListItem> listOfValues)
    {
        return htmlHelper.RadioButtonForSelectList(expression, listOfValues, null);
    }

    public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        IEnumerable<SelectListItem> listOfValues,
        object htmlAttributes)
    {
        return htmlHelper.RadioButtonForSelectList(expression, listOfValues, new RouteValueDictionary(htmlAttributes));
    }

    public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        IEnumerable<SelectListItem> listOfValues,
        IDictionary<string, object> htmlAttributes)
    {
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var sb = new StringBuilder();
        if (listOfValues != null)
        {
            foreach (SelectListItem item in listOfValues)
            {
                var id = string.Format(
                    "{0}_{1}",
                    metaData.PropertyName,
                    item.Value
                );

                var radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = id }).ToHtmlString();
                sb.AppendFormat(
                    "{0}<label for=\"{1}\">{2}</label>",
                    radio,
                    id,
                    HttpUtility.HtmlEncode(item.Text)
                );
            }
        }
        return MvcHtmlString.Create(sb.ToString());
    }
}

1 个答案:

答案 0 :(得分:1)

在第三种方法中,看起来传递给正在创建的radion按钮的html属性是new { id = id }。尝试用方法中的参数替换它。

<强>已更新

在html属性中包含id,并在每次循环迭代中为id分配一个新值。

if (listOfValues != null)
{
    if (!htmlAttributes.ContainsKey("id"))
    {
        htmlAttributes.Add("id", null);
    }
    foreach (SelectListItem item in listOfValues)
    {
        var id = string.Format(
            "{0}_{1}",
            metaData.PropertyName,
            item.Value
        );
        htmlAttributes["id"] = id;
        var radio = htmlHelper.RadioButtonFor(expression, item.Value, htmlAttributes).ToHtmlString();
        sb.AppendFormat(
            "{0}<label for=\"{1}\">{2}</label>",
            radio,
            id,
            HttpUtility.HtmlEncode(item.Text)
        );
    }
}