如何向剃刀助手添加参数

时间:2013-09-27 10:41:54

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

我想知道如何通过帮助程序编写HTML Helper(如@Html.TextBoxFor(model => model.signature))来生成输入中的data-id参数。

<input type="text" name="signature"  data-id="No Signature" />

注1:dataId之类的参数由htmlAttributes起作用,因为它是一个简单的变量。

注2:我知道扩展方法和使用@{var attributes = new Dictionary<string, object>{{ "data-id", "No Signature" }};}

之类的属性

我觉得必须有更好的方法来解决这个问题。任何想法......?

非常感谢。

3 个答案:

答案 0 :(得分:4)

您可以通过以下方式添加data-个属性:

@Html.TextBoxFor(model => model.signature, new { data_id = "No signature" })

您必须使用下划线(_)而不是短划线(-)。

提示:您也可以在Model属性中使用data-个变量:

new { data_id = Model.Id }

答案 1 :(得分:1)

您可以创建自己的custom helpers,如:

 public static class TextBoxExtensions
     {
          public static string CustomTextBox(this HtmlHelper helper, string name)
          {
               return String.Format("<input type='text' name={0} data-id='No Signature'></input>", name);
          }
     }

然后在您的视图中,您可以执行以下操作:

@Html.CustomTextBox("signature");

答案 2 :(得分:-2)

下面的代码将通过扩展TextBoxFor来创建CustomTextBoxFor助手。这使您可以充分利用MVC的验证约定,并打开htmlAttributes参数,以便根据需要添加更多属性。

        public static MvcHtmlString CustomTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
            Expression<Func<TModel, TProperty>> expression, string customData)
        {
            return htmlHelper.CustomTextBoxFor(expression, customData, (IDictionary<string, object>)null);
        }

        public static MvcHtmlString CustomTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
           Expression<Func<TModel, TProperty>> expression, string customData, object htmlAttributes)
        {
            IDictionary<string, object> attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
            attributes.Add("data-custom", customData);
            return htmlHelper.TextBoxFor(expression, new { data_custom = "customData" });
        }

用法:

@Html.CustomTextBoxFor(model => model.MyProperty, Model.CustomData)
@Html.CustomTextBoxFor(model => model.MyProperty, Model.CustomData, new { @class="pretty"})