Редактор для tModel

#asp.net-mvc-3 #view #razor #editorfor

#asp.net-mvc-3 #Вид #razor #редактор для

Вопрос:

подпись для этого очень полезного метода гласит, что я могу указать тип:

 public static MvcHtmlString EditorFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression
)
  

… в документах очень понятно указано, что tModel — это «Тип модели». Должно быть, я склонен к тому, что это описание не имеет для меня никакого значения вообще. Я поискал объяснение в Google, но не нашел ничего.

Я нахожусь в представлении, где @model Website.Models.Product но хочу создать редактор для чего-то другого типа. Я думал, что смогу:

 @Html.EditorFor(@ViewBag.AClassOfTheOtherType)
  

или, может быть (я, очевидно, предполагаю):

 @Html.EditorFor(TheOtherType)
  

но это неприемлемый синтаксис, и поэтому я подумал:

 @Html.EditorFor(x => x...)
  

но лямбда-выражение, похоже, привязано к @model … итак, я подумал: «Ах!»:

 @Html.EditoFor<TheOtherType>(...)
  

но VS считает, что < запускает HTML-тег и указывает на завершение моего вызова EditorFor (который завершается неудачей).

ааааааххххх!

как мне это сделать (на случай, если мне действительно нужно спросить)?

Ответ №1:

Не тестировал это, но не могли бы вы сделать:

 @Html.EditorFor(x => ViewBag.AClassOfTheOtherType)
  

Вам не обязательно использовать переменную, переданную в лямбда-выражение.

Комментарии:

1. Я и не представлял, что смогу это сделать. Я попробую это сделать. Спасибо!

Ответ №2:

Модель — это модель — M в MVC

tModel с таким же успехом может быть sdserweJJG — он постоянно называется tModel только по соглашению.

Во вспомогательном методе для EditorFor вы увидите что-то вроде:

  TValue val = expression.Compile()(htmlHelper.ViewData.Model);
  

здесь метод расширения компилирует переданный лямбда-код — например, x=>x.Model.Property часть — и возвращает фактические данные модели для использования при создании фактических элементов управления отображением.

Модель передается в представление при вызове return View(viewModel); из вашего действия контроллера.

То, что вы пытаетесь сделать, не имеет смысла, потому что метод был разработан для работы с моделью views.

Однако вы можете использовать @Html.Editor , поскольку это примет фактическое значение так, как вы пытаетесь:

 @Html.Editor(ViewBag.AClassOfTheOtherType)
  

Исходный код для MVC находится в свободном доступе для загрузки и просмотра — на это стоит потратить время 🙂

Комментарии:

1. итак, модель — это то, что я привязываю с помощью директивы @model. но тогда какой смысл в .EditorFor<tModel>(), если не указывать, что тип модели (который будет использоваться при выполнении вызова) является чем-то иным, чем Model?

2. Я пытался @Html.Editor(ViewBag.AClassOfTheOtherType) , но это кажется неподдерживаемым синтаксисом. существует 6 перегрузок, и ни одна из них просто не использует подобный объект … помимо этого, делает . Редактор () понимает общие / редактируемые шаблоны? потому что у меня там есть кое-что, инкапсулированное

3. что я получаю: Ошибка 11 ‘System.Web.Mvc.HtmlHelper<Веб-сайт. Models.Quiz>’ не имеет применимого метода с именем ‘Editor’, но, похоже, имеет метод расширения с таким именем. Методы расширения не могут быть отправлены динамически. Рассмотрите возможность приведения динамических аргументов или вызова метода расширения без синтаксиса метода расширения. c:UsersekkisDocumentsVisual Studio 2010ProjectsTestWebsiteViewsXDetails.cshtml

4. по какой-либо причине этого материала нет в tModel?

5. Я все еще не понимаю этого … если помощник предоставляет мне средство указать модель, которую он должен использовать для лямбда-выражения, почему я не могу этого сделать @Html.EditoFor<TheOtherType>(...) ? или, если это не является целью <tModel>, тогда что это?

Ответ №3:

ответ таков (барабанная дробь, пожалуйста)… да, можно связать лямбда-выражение с декларатором типа. единственная проблема заключается в редакторе Visual Studio, который считает, что завершается часть C # и вводится часть HTML с открытием < и, таким образом, запрещает правильный код. Решение:

 @{ Html.EditoFor<TheOtherType>(...) }