Я пытаюсь создать лямбда-выражение для перехода к представлению через мое вспомогательное расширение 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> каждый из них будет иметь внутреннюю проблему и все еще ищет аккуратное решение.
благодаря
Я не могу, кажется, повторить вашу проблему, это, казалось бы, скомпилируется просто отлично;
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;
}