Rufen Sie asp.net mvc Html Helper in benutzerdefinierten HTML-Helper mit Ausdrucksparameter

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

Frage

Ich versuche, eine HTML-Helfererweiterung innerhalb des asp.net mvc Rahmens zu schreiben.

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;

    }

Die Linie

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

hat einen Syntaxfehler. Aber ich verstehe es nicht. Der Fehler ist: Fehler 2 "System.Web.Mvc.HtmlHelper" enthebt keine Definition für "ValidationMessageFor", und die Änderung der optimalen Erweiterungsmethode "System.Web.Mvc.Html.ValidationExtensions.ValidationMessageFor (System.Web.Mvc. HtmlHelper, System.Linq.Expressions.Expression>) "weist einige ungünstige Argumente auf. C: \ Projects \ WorkstreamPlatform \ WorkstreamPlatform_WebRole \ Erweiterungen \ PlatformHtmlHelpersExtensions.cs 97 27 WorkstreamPlatform_WebRole

Entsprechend der Meldung ist der Parameter ungültig. Aber die Methode wird tatsächlich folgendermaßen deklariert:

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

Also eigentlich sollte es funktionieren.

Akzeptierte Antwort

Ändern Sie Ihre Methodendeklaration zu:

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

}

Beachten Sie den generischen this HtmlHelper<TModel> . Auch das zweite Argument ist nicht notwendig, da Sie das Modell vom stark typisierten Helfer abrufen können:

var model = instance.ViewData.Model;


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum