ASP.Net MVC - 无法识别这个HtmlHelper'

时间:2016-01-19 12:11:31

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

我尝试为自定义日期格式实现自定义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)

这就是错误:

  

没有任何论据符合所要求的形式参数&#39;表达式&#39; &#39; MyHtmlHelpers.MyDateFor(HtmlHelper,Expression&gt;)&#39;

我的猜测是ASP并没有用适当的价值取代this HtmlHelper<TModel> htmlHelper或者不知道如何。尽管MyDateFor方法与InputExtensions.cs中定义的TextBoxFor方法具有相同的签名:

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

2 个答案:

答案 0 :(得分:2)

该行:

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

应该是:

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

您已经延长this HtmlHelper<TModel>

基本上,this HtmlHelper<TModel> htmlHelper行使其成为HtmlHelper<TModel>的扩展方法 &#34;引擎盖下&#34; cshtml文件的类型是WebViewPage<TModel>,并且上面有这一行:

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

这使您的扩展程序可以@html

使用

答案 1 :(得分:1)

必须是@Html.MyDateFor(model => model.ExpirationDate)而不是@MyHtmlHelpers.MyDateFor(model => model.ExpirationDate)