0

我现在正在使用这段代码来使用 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());
    }
}
4

1 回答 1

2

在第三种方法中,看起来传递给正在创建的 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)
        );
    }
}
于 2013-01-14T05:46:12.390 回答