#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>(...) }