使用表达式参数在自定义html帮助器中调用asp.net mvc Html Helper

时间:2010-05-11 11:59:40

标签: asp.net-mvc lambda expression-trees html-helper

我正在尝试在asp.net mvc框架中编写一个html帮助扩展。

public static MvcHtmlString PlatformNumericTextBoxFor<TModel>(this HtmlHelper instance, TModel model, Expression<Func<TModel,double>> selector)
        where TModel : TableServiceEntity
    {
        var viewModel = new PlatformNumericTextBox();

        var func = selector.Compile(); 

        MemberExpression memExpession = (MemberExpression)selector.Body;
        string name = memExpession.Member.Name;

        var message = instance.ValidationMessageFor<TModel, double>(selector);

        viewModel.name = name;
        viewModel.value = func(model);
        viewModel.validationMessage = String.Empty;

        var result = instance.Partial(typeof(PlatformNumericTextBox).Name, viewModel);

        return result;

    }

该行

var message = instance.ValidationMessageFor<TModel, double>(selector);

有语法错误。但我不明白。错误是:Fehler 2“System.Web.Mvc.HtmlHelper”enthältkeine定义für“ValidationMessageFor”,unddieÜberladungder optimalen Erweiterungsmethode“System.Web.Mvc.Html.ValidationExtensions.ValidationMessageFor(System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression&gt;)“weisteinigeungültigeArgumenteauf。 C:\ Projects \ WorkstreamPlatform \ WorkstreamPlatform_WebRole \ Extensions \ PlatformHtmlHelpersExtensions.cs 97 27 WorkstreamPlatform_WebRole

因此根据消息,参数无效。但该方法实际上是这样声明的:

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

所以实际上它应该有用。

1 个答案:

答案 0 :(得分:4)

将您的方法声明更改为:

public static MvcHtmlString PlatformNumericTextBoxFor<TModel>(
    this HtmlHelper<TModel> instance, 
    TModel model, 
    Expression<Func<TModel,double>> selector) where TModel : TableServiceEntity
{

}

注意通用this HtmlHelper<TModel>。此外,第二个参数不是必需的,因为您可以从强类型帮助器中检索模型:

var model = instance.ViewData.Model;