【问题标题】:How to set "Html.SomeHelper" attribute value to be equal to model property name?如何设置“Html.SomeHelper”属性值等于模型属性名称?
【发布时间】:2017-03-02 19:09:30
【问题描述】:

我有表单模型,我想使用属性名称作为某些表单字段属性的值。最好的方法是什么? (在这种情况下,我想要 id="PropertyName")。

// FormViewModel
[Display(Name = "First name*")]
[Required(ErrorMessage = "This field is required")]
public string FirstName { get; set; }

// Index.cshtml
<form id="form1" asp-controller="controller" asp-action="Index" method="post">
 <div class="form-group">
   @Html.TextBoxFor(m => m.FirstName, new
   {
     @id = "firstName",
     @placeholder = Html.DisplayNameFor(m => m.FirstName)
   })
   @Html.ValidationMessageFor(m => m.FirstName)
 </div>
</form>

tnx!

【问题讨论】:

  • @Html.TextBoxFor(m =&gt; m.FirstName, new { @id = Model.FirstName, @placeholder = Html.DisplayNameFor(m =&gt; m.FirstName) }) ?
  • @Theo,是的,就这样。

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


【解决方案1】:

正如@teo van kot 所说,MVC 默认会这样做。但是,如果您的属性的路径类似于 model.Submodel.PropertyName,则 ID 属性将为“Submodel_PropertyName”。如果您只想要“PropertyName”,则可以使用此扩展方法/包装器:

public static class Extension method
{
    public static IHtmlContent CustomTextBoxFor<TModel, TResult>(this IHtmlHelper<TModel> helper, Expression<Func<TModel, TResult>> expression)
    {
        // very simple implementation, can fail if expression is not as expected!

        var body = expression.Body as MemberExpression;

        if(body == null) throw new Exception("Expression refers to a method, not a property");

        return helper.TextBoxFor(expression, null, new { id = body.Member.Name, placeholder = helper.DisplayNameFor(expression)  });
    }
}

在剃刀视图中输出会是这样的:

@Html.CustomTextBoxFor(x => x.Foo)
<input id="Foo" name="Foo" type="text" placeholder="Foo" value="">

@Html.TextBoxFor(x => x.Foo)
<input id="Foo" name="Foo" type="text" value="">

@Html.CustomTextBoxFor(x => x.AnotherModel.Foo)
<input id="Foo" name="AnotherModel.Foo" type="text" placeholder="Foo"  value="">

@Html.TextBoxFor(x => x.AnotherModel.Foo)
<input id="AnotherModel_Foo" name="AnotherModel.Foo" type="text" value="">

第一种和第三种方法的问题,因此使用这种技术,如果您在模型中的多个位置具有相同的属性名称:

@Html.CustomTextBoxFor(x => x.DeliveryAddress.StreetName)
@Html.CustomTextBoxFor(x => x.BillingAddress.StreetName)

两个输入标签将具有相同的 ID 属性!

示例是为 MVC6 编写的,MVC5 使用不同的 HtmlHelper 类型。

【讨论】:

    【解决方案2】:

    您不应该像这样逃避您的 placeholder 属性:

       @Html.TextBoxFor(m => m.FirstName, new
       {
         @id = "firstName",
         placeholder = Html.DisplayNameFor(m => m.FirstName)
       })
    

    另外,@id = "firstName" 强类型助手中也不需要默认添加带有属性名称的id 属性,因此在您的情况下会是这样:

       @Html.TextBoxFor(m => m.FirstName, new
       {
         placeholder = Html.DisplayNameFor(m => m.FirstName)
       })
    

    【讨论】:

      【解决方案3】:

      根据上面的评论,看起来您正在寻找的解决方案是这样的

      @Html.TextBoxFor(m => m.FirstName, 
      new { @id = Model.FirstName, 
      @placeholder = Html.DisplayNameFor(m => m.FirstName) 
      })
      

      但我会说那里肯定有代码味道......这是一件非常奇怪的事情。

      【讨论】:

        猜你喜欢
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        相关资源
        最近更新 更多