ASP.NET MVC - 在自定义HTML帮助器中使用模型

时间:2016-03-25 14:16:38

标签: asp.net-mvc

我正在使用ASP.NET MVC和Bootstrap构建应用程序。在我的应用程序中,我有一个看起来像这样的模型的视图:

public class EntryModel
{
  [Required(ErrorMessage="Please enter the name.")]
  [Display(Name="Name")]
  public string Name { get; set; }

  [Required (ErrorMessage="Please enter the description.")]
  [Display(Name = "Description")]
  public string Description { get; set; }
}

在这个应用程序中,我还定义了一个自定义html助手,如下所示:

public static class MyHelpers
{
  public static MvcHtmlString MyTextBox(this HtmlHelper helper)
  {
    var sb = new StringBuilder();
    sb.Append("<div class=\"form-group\">");
    sb.Append("<label class=\"control-label\" for=\"[controlId]\">[labelValue]</label>");
    sb.Append("<input class=\"form-control\" id=\"[controlId]\" name=\"controlId\" type=\"text\" value=\"[propertyValue]\">");
    sb.Append("</div>");

    return MvcHtmlString.Create(sb.ToString());
  }
}

我在Razor视图中使用了这个帮助器和模型,如下所示:

@model EntryModel
<h2>Hello</h2>

@using (Html.BeginForm("Add", "Entry", new {}, FormMethod.Post, new { role="form" }))
{
  @Html.MyTextBox() 
}

我正在尝试从模型的属性中生成帮助器中的labelValuecontrolIdpropertyValue值。例如,我想使用@Html.MyTextBoxFor(m => m.Name)并让助手生成如下内容:

<div class="form-group">
  <label class="control-label" for="Name">Name</label>");
  <input class="form-control" id="Name" name="Name" type="text" value="Jon">
</div>

基本上,我不知道如何将我的模型信息输入到我的html助手中。

1 个答案:

答案 0 :(得分:1)

使用此示例作为参考:

        public static MvcHtmlString AutoSizedTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
        {     
          var attributes = new Dictionary<string, Object>();
          var memberAccessExpression = (MemberExpression)expression.Body;
          var stringLengthAttribs =  memberAccessExpression.Member.GetCustomAttributes(
            typeof(System.ComponentModel.DataAnnotations.StringLengthAttribute), true);

         if (stringLengthAttribs.Length > 0)
         {
            var length = ((StringLengthAttribute)stringLengthAttribs[0]).MaximumLength;

            if (length > 0)
            {
                attributes.Add("size", length);
                attributes.Add("maxlength", length);
            }
        }

        return helper.TextBoxFor(expression, attributes);
    }

你可以在这样的视图中调用它:  @ Html.AutoSizedTextBoxFor(x =&gt; x.Address2)