Расширение MVC - привязка модифицированного лямбда-выражения

1

Я пытаюсь создать лямбда-выражение для перехода к представлению через мое вспомогательное расширение MVC, которое будет использоваться.

То, что я пробовал, похоже на это:

Expression<Func<DoubleNumber,DoubleNumber>> expr2 = (DoubleNumber g) => g.Num1; 

Выражение по умолчанию было передано следующим образом:

    public static MvcHtmlString DoubleBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        //int id, 
        Expression<Func<TModel, TProperty>> expression)
    {
...

Модельный класс

public class DoubleNumber
{
    public int Num1 { get; set; } // tried strings but again they are null
    public int Num2 { get; set; }
}

После использования правильного формата выражения все равно не сможет его использовать: Правильный формат:

Expression<Func<DoubleNumber,int>> expr2 = (DoubleNumber g) => g.Num1;  

который упоминается в комментариях.

Ошибка:

"the type arguments cannot be inferred from the usage. try specifying the type arguments explicitly."

Спасибо за любую помощь. Отредактировано 2 - изменено

Код доказан:

public static class DoubleBoxHelper
{
    public static MvcHtmlString DoubleBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        //int id, 
        Expression<Func<TModel, TProperty>> expression)
    {
        var builder = new StringBuilder();
        var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var model = metadata.Model as DoubleNumber;
        var name = ExpressionHelper.GetExpressionText(expression);
        var fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
        var fieldId = TagBuilder.CreateSanitizedId(fullName);

// I'm going to use something like this instead of "expression" which seems because of the format or parameter or anything else it producing an error which I mentioned,

    Expression<Func<DoubleNumber,int>> expr2 = (DoubleNumber g) => g.Num1; 

//The line which will cause the error happened

    builder.AppendLine(htmlHelper.TextBoxFor(expr2 , new {class, etc} )

...
}

Я также пробовал некоторые другие формы TextBoxFor, например TextBoxFor, или пытался сделать Expression> каждый из них будет иметь внутреннюю проблему и все еще ищет аккуратное решение.

благодаря

Теги:
linq
asp.net-mvc
lambda

1 ответ

2
Лучший ответ

Я не могу, кажется, повторить вашу проблему, это, казалось бы, скомпилируется просто отлично;

public static class DoubleBoxHelper
{
    public static MvcHtmlString DoubleBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression)
    {
        var builder = new StringBuilder();

        builder.AppendLine(htmlHelper.TextBoxFor(expression, new {bop = 1}).ToHtmlString());
        return null;
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            HtmlHelper<DoubleNumber> helper = ...
            helper.DoubleBoxFor(g => g.Num1);
        }
    }
}

Единственная проблема, которую я вижу в вашем коде, заключается в том, что ваше выражение жестко закодировано для определенного типа, в то время как ваш HtmlHelper является общим. Поскольку метод можно вызывать с любым типом HtmlHelper, а общие параметры должны совпадать между выражением и помощником, компилятор не позволит вам скомпилировать код. Если вы либо возьмете жестко закодированный HtmlHelper<DoubleNumber> либо как код выше, возьмите выражение с соответствующими стандартными параметрами, все будет хорошо компилироваться.

EDIT: Если вы хотите построить выражения внутри помощника, вам не нужно, чтобы он был вообще не общим;

public static MvcHtmlString DoubleBoxFor(this HtmlHelper<DoubleNumber> htmlHelper)
{
    var builder = new StringBuilder();

    builder.AppendLine(htmlHelper.TextBoxFor(g => g.Num1, new { bop = 1 }).ToHtmlString());
    builder.AppendLine(htmlHelper.TextBoxFor(g => g.Num2, new { bop = 1 }).ToHtmlString());
    return null;
}
  • 0
    Самая важная часть для меня в том, что расширение, как вы сказали, будет нацелено на определенный тип, который будет показывать это должным образом. Если бы вы могли упомянуть, как вместо «expression» в вашем коде я могу использовать свойство «Num1» такого типа, все сделано, и это нормально, спасибо за вашу помощь.
  • 0
    Я могу удовлетворить его как общий, но, пожалуйста, перенесите ваше назначение на стороне программы в само расширение, которое я мог бы назначить каждому свойству, например, в другое текстовое поле или т. Д., Спасибо +1
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню