【问题标题】:Asp.Net MVC Call HtmlHelper with a variableAsp.Net MVC 使用变量调用 HtmlHelper
【发布时间】:2020-01-28 17:14:26
【问题描述】:

我使用 HtmlHelper(在 Asp.Net MVC 4.5 中)为每个类属性创建多个经过验证的字段。现在,我需要依次调用它们。

@Html.LabelFor(m => m.SomeField)
@Html.EditorFor(m => m.SomeField)
@Html.ValidationMessageFor(m => m.SomeField)

因此,我宁愿只将“m => m.SomeField”传递给 ViewHelper 并让它变成这样。

@helper FieldHelper([???] ValueINeed)
{
    @Html.LabelFor(ValueINeed)
    @Html.EditorFor(ValueINeed)
    @Html.ValidationMessageFor(ValueINeed)
}

// And then call the helper with...
ViewHelper.FieldHelper(m => m.SomeField)

我的问题是:这可能吗?变量是什么类型的? Microsoft 文档说它是“Expression>”,但我无法用该值构造这样的对象。提前谢谢大家。

【问题讨论】:

  • 那么添加这个额外的抽象层有什么好处呢? ViewHelper.FieldHelper 有更多的字符,你得到了什么?
  • 使查看代码更容易浏览。此外,助手做了一些这里没有展示的事情,主要是为公司品牌 UI 提供布局。
  • @CodingYoshi 我注意到我忘记了示例中的其他两个字段,很抱歉造成混淆。
  • 我会通过Html.LabelCustomFor 之类的扩展来完成,并复制Html.LabelFor 的签名。在这个新方法中添加您的自定义内容。

标签: c# asp.net asp.net-mvc


【解决方案1】:

我不认为你可以使用助手来做到这一点,我很确定你将不得不创建一个扩展方法:

public static MvcHtmlString FieldHelper<TModel, TItem>(this HtmlHelper<TModel> html, Expression<Func<TModel, TItem>> expr)
{
  var output = html.LabelFor(expr);
  output += html.EditorFor(expr);
  output += html.ValidationMessageFor(expr);
  return MvcHtmlString.Create(output);
}

然后在你看来调用:

@Html.FieldHelper(x =&gt; x.SomeField)

【讨论】:

  • 我记得以前尝试过类似的东西,但由于某种原因,“...不包含 LabelFor 的定义”(等等)问题总是出现。
  • 很可能缺少using 语句:using System.Web.Mvc; using System.Web.Mvc.Html;
  • 你说得对,我确实忘记了导入。非常感谢,这个建议奏效了!
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 2011-03-30
  • 2010-11-23
  • 2010-09-21
  • 2015-01-14
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多