如何通过html辅助方法更改或添加属性到html字段?

时间:2016-10-25 13:06:57

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

我想基于布尔值禁用或启用文本框,我创建了这个扩展方法:

public static IHtmlString MyTextBoxFor<TModel,TProperty>(
            this HtmlHelper<TModel> htmlHelper,
            Expression<Func<TModel,TProperty>> expression,
            object htmlAttributes,
            bool disabled
            )
        {
            var attributes = new RouteValueDictionary(htmlAttributes);
            if (disabled)
            {
                attributes.Add("disabled", "\"disabled\"");
            }
            return htmlHelper.TextBoxFor(expression, htmlAttributes);
        }

我的使用方式:

        <div class="col-md-10">
            @Html.MyTextBoxFor(model => model.Body, new { @class = "form-control"}, true)
        </div>

但它不起作用,我是Htmlhelper课程的新手,虽然它不难理解,但我当然错过了一些东西!

修改

我尝试了这个简单的方法,找出问题所在:

public static IHtmlString MyTextBox(this HtmlHelper htmlHelper,object htmlAttributes, bool disabled)
        {
            IDictionary<string, object> attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
            //var attrs = new Dictionary<string,string>();
            if (disabled)
            {
                attrs.Add("disabled", "disabled");
                attrs.Add("value", "txxxxxxt");
            }
            return htmlHelper.TextBox("txtbx", attrs);
        }

这已经呈现: <input id="txtbx" name="txtbx" type="text" value="System.Collections.Generic.Dictionary``2[System.String,System.String]">

1 个答案:

答案 0 :(得分:2)

扩展方法的代码必须是

public static IHtmlString MyTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
{
    IDictionary<string, object> attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
    if (disabled)
    {
        attrs.Add("disabled", "disabled");
    }
    return htmlHelper.TextBoxFor(expression, attrs);
}

在您的第一个代码示例中,您使用了

return htmlHelper.TextBoxFor(expression, htmlAttributes);

返回原始属性,而不是包含disabled属性的更新属性。应该是

return htmlHelper.TextBoxFor(expression, attributes);

在你的第二个代码示例中,使用TextBox()方法而不是TextBoxFor()和第二个参数是值,而不是属性,它应该是

return htmlHelper.TextBox("txtbx", null, attrs);

虽然由于name属性不正确而无法绑定您的媒体资源。

旁注:有点不清楚为什么你会想要这样做。禁用的控件不提交值,因此您也可以在视图中将属性的值呈现为文本。如果您确实希望提交其值,那么它应该是readonly,而不是disabled