Аргументы типа не могут быть выведены из использования.Попробуйте явно указать аргументы типа - PullRequest
32 голосов
/ 11 февраля 2011

Может кто-нибудь, пожалуйста, уточнить что-нибудь для меня.В моем приложении ASP.NET MVC 2 у меня есть класс BaseViewModel, который включает следующий метод:

public virtual IDictionary<string, object> GetHtmlAttributes<TModel, TProperty>
                        (Expression<Func<TModel, TProperty>> propertyExpression)
{
    return new Dictionary<string, object>();
}

Идея состоит в том, что каждая дочерняя модель может переопределить этот метод и предоставить подходящий наборhtml-атрибуты, основанные на некоторой логике, которые будут отображаться в представлении:

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
                                                 (model => model.MyProperty)) %>

Однако при использовании, как в приведенной выше строке, я получаю ошибку компиляции при попадании в представление:

Аргументы типа для метода '...BaseViewModel.GetHtmlAttributes<TModel,TProperty> Expression<System.Func<TModel,TProperty>)' не могут быть выведены из использования.Попробуйте явно указать аргументы типа.

Я должен сделать следующее:

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes
                             <ChildModel, string>(model => model.MyProperty)) %>

Я просто ищу некоторую ясность в том, как он пытается вывести тип,у него нет проблем с этим в методе расширения HtmlHelper/TextBoxFor?

Это потому, что HtmlHelper в представлении будет автоматически для того же типа, который указан в ViewUserControl в верхней части страницы, тогда как мой код может быть для любого типа, унаследованного от BaseViewModel?Можно ли написать это так, чтобы это могло вывести мои модели / типы свойств?

Ответы [ 7 ]

17 голосов
/ 27 октября 2012

Я знаю, что на этот вопрос уже есть принятый ответ, но для меня, начинающего .NET, было простое решение того, что я делал неправильно, и я думал, что поделюсь им.

Я делал это:

@Html.HiddenFor(Model.Foo.Bar.ID)

То, что у меня работало, менялось на это:

@Html.HiddenFor(m => m.Foo.Bar.ID)

(где «m» - произвольная строка для представлениямодельный объект)

14 голосов
/ 16 декабря 2011

У меня была такая же проблема, мое решение:В файле web.config:

<compilation debug="true>должен был быть изменен на<compilation debug="true" targetFramework="4.0">

14 голосов
/ 19 апреля 2011

В вашем примере компилятор не может знать, каким должен быть тип TModel.Вы можете сделать что-то похожее на то, что вы, вероятно, пытаетесь сделать с помощью метода расширения.

static class ModelExtensions
{
   public static IDictionary<string, object> GetHtmlAttributes<TModel, TProperty>
      (this TModel model, Expression<Func<TModel, TProperty>> propertyExpression)
   {
       return new Dictionary<string, object>();
   }
}

Но вы не сможете иметь ничего похожего на virtual, я думаю.

РЕДАКТИРОВАТЬ:

На самом деле, вы можете сделать virtual, используя обобщенные ссылки:

class ModelBase<TModel>
{
    public virtual IDictionary<string, object> GetHtmlAttributes<TProperty>
        (Expression<Func<TModel, TProperty>> propertyExpression)
    {
        return new Dictionary<string, object>();
    }
}

class FooModel : ModelBase<FooModel>
{
    public override IDictionary<string, object> GetHtmlAttributes<TProperty>
        (Expression<Func<FooModel, TProperty>> propertyExpression)
    {
        return new Dictionary<string, object> { { "foo", "bar" } };
    }
}
4 голосов
/ 11 января 2016

Эта ошибка также связана с проблемой кеша .

У меня была такая же проблема, и она была решена только очисткой и сборкой решение снова.

3 голосов
/ 12 апреля 2011

Компилятор C # имеет только лямбду

arg => arg.MyProperty

для типа вывода arg (TModel) и типа arg.MyProperty (TProperty).Это невозможно.

0 голосов
/ 28 февраля 2013

В случае, если это помогает, я столкнулся с этой проблемой при передаче null в параметр для универсального TValue, чтобы обойти это, вы должны привести свои нулевые значения:

(string)null

(int)null

и т.д.

0 голосов
/ 13 февраля 2011

Вы имеете в виду тип, а не экземпляр. В примере второго и четвертого примеров кода сделайте строчную букву 'Model'.

Model.GetHtmlAttributes

должно быть

model.GetHtmlAttributes
...