Llame a asp.net mvc Html Helper dentro del ayudante html personalizado con el parámetro de expresión

asp.net-mvc expression-trees html-helper lambda

Pregunta

Estoy tratando de escribir una extensión html helper dentro del marco asp.net mvc.

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;

    }

La línea

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

tiene un error de sintaxis. Pero no lo entiendo. El error es: Fehler 2 "System.Web.Mvc.HtmlHelper" enthält keine Definición für "ValidationMessageFor", und die äberladung der optimen Erweiterungsmethid.alvoyo.Personas de control de eventos. HtmlHelper, System.Linq.Expressions.Expression>) "weist einige ungültige Argumente auf. C: \ Projects \ WorkstreamPlatform \ WorkstreamPlatform_WebRole \ Extensions \ PlatformHtmlHelpersExtensions.cs 97 27 WorkstreamPlatform_WebRole

Así que de acuerdo con el mensaje, el parámetro no es válido. Pero el método se declara así:

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

Así que en realidad debería funcionar.

Respuesta aceptada

Cambie su declaración de método a:

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

}

Observe el genérico this HtmlHelper<TModel> . Además, el segundo argumento no es necesario, ya que puede recuperar el modelo desde el ayudante fuertemente tipado:

var model = instance.ViewData.Model;


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow