【问题标题】:ASP.Net MVC - Won't recognize 'this HtmlHelper'ASP.Net MVC - 无法识别“这个 HtmlHelper”
【发布时间】:2016-01-19 12:11:30
【问题描述】:

我正在尝试为自定义日期格式实现自定义 HtmlHelper。
(因为TextBoxFor 忽略了日期格式属性,EditorFor 忽略了类,但这不是问题)
这是自定义 HtmlHelper :

namespace SigmaAdminCore.MyHtmlHelpers
{
    public static class MyHtmlHelpers
    {
        public static MvcHtmlString MyDateFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
        {
            var mvcHtmlString = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, new { @class = "text-box single-line date-picker" });
            var xDoc = XDocument.Parse(mvcHtmlString.ToHtmlString());
            var xElement = xDoc.Element("input");
            if (xElement != null)
            {
                var valueAttribute = xElement.Attribute("value");
                if (valueAttribute != null)
                {
                    valueAttribute.Value = DateTime.Parse(valueAttribute.Value).ToShortDateString();
                    if (valueAttribute.Value == "1/1/0001")
                        valueAttribute.Value = string.Empty;
                }
            }
            return new MvcHtmlString(xDoc.ToString());
        }
    }
}

在我看来,我有:

@using SigmaAdminCore.MyHtmlHelpers
...
@MyHtmlHelpers.MyDateFor(model => model.ExpirationDate)

这是错误:

没有给出与“MyHtmlHelpers.MyDateFor(HtmlHelper, Expression>)”所需的形参“表达式”相对应的参数

我的猜测是 ASP 没有用正确的值替换 this HtmlHelper&lt;TModel&gt; htmlHelper,或者不知道如何替换。即使MyDateFor 方法与 InputExtensions.cs 中定义的TextBoxFor 方法具有相同的签名:

public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)

【问题讨论】:

  • 只是@Html.MyDateFor()(不是@MyHtmlHelpers.MyDateFor()
  • 您可能还想考虑将&lt;add namespace="SigmaAdminCore.MyHtmlHelpers" /&gt; 添加到您的web.config 文件中,这样您就不需要视图中的using 语句

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


【解决方案1】:

行:

@MyHtmlHelpers.MyDateFor(model => model.ExpirationDate)

应该是:

@Html.MyDateFor(model => model.ExpirationDate)

正如你扩展了this HtmlHelper&lt;TModel&gt;


基本上this HtmlHelper&lt;TModel&gt; htmlHelper 行使其成为HtmlHelper&lt;TModel&gt; 的扩展方法。
“在幕后”,cshtml 文件的类型是WebViewPage&lt;TModel&gt;,上面有这一行:

public HtmlHelper<TModel> Html { get; set; }

这使@html 可以使用您的扩展方法

【讨论】:

  • 感谢您的解决方案。你能解释一下我的类是如何在没有明确指定的情况下扩展 HtmlHelper 的吗?另外,我认为MyDateFor 方法只能从我创建的类中访问,怎么可能从@Html. 访问?
【解决方案2】:

必须是@Html.MyDateFor(model =&gt; model.ExpirationDate) 而不是@MyHtmlHelpers.MyDateFor(model =&gt; model.ExpirationDate)

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多