Нет строго типизированного метода View () для возврата ActionResult. Итак, предположим, у меня есть
class Edit : ViewPage<Frob>
В моем FrobController я буду делать что-то вроде «return View (« Edit », someFrob);». Здесь нет проверки, поэтому я всегда должен вручную синхронизировать представление и использование его контроллером. Это неоптимально, и я не знаю никаких встроенных исправлений.
Я добавил этот метод в базовый класс моего контроллера:
public ActionResult ViewPage<V, M>(V view, M model)
where V : ViewPage<M>
where M : class {
return View(typeof(V).Name, model);
}
Примечание: причина, по которой я смотрю
объект, который никогда не используется, потому что,
AFAIK, нет способа получить тип C #
умозаключение работать иначе. Если я
убрал параметр просмотра, мне нужно
указать V явно, что также
значит тоже указывать M явно ...
Вздох.
Итак, теперь я могу сделать это:
return ViewPage(new Views.Frob.Edit(), myFrob);
Я указываю точное представление (без проблем, если оно переименовывается), и myFrob проверяется на тип, чтобы быть подходящим типом модели. Уродливая сторона в том, что я новичок в редактировании. В качестве альтернативы я мог бы написать:
return ViewPage((Views.Frob.Edit)null, myFrob);
Один минус в том, что модель должна точно соответствовать. Так что с ViewPage> я не могу передать в список. Я думал, что это может сработать:
public ActionResult ViewPage<V, M, T>(V view, T model)
where V : ViewPage<M>
where M : class
where T : M {
return View(typeof(V).Name, model);
}
Но вывод типа C # не может этого понять. Другая потенциальная проблема заключается в том, что имя типа представления может быть неправильным, так как я думаю, что оно может быть переопределено атрибутами. Но это легко исправить, если я столкнусь с этим.
Вопросы:
- Как мне сделать этот синтаксис чище?
- Какие минусы мне здесь не хватает?
Редактировать: Что касается Контроллера, знающего о Представлении, это только немного делает. Единственное, что он получает из представления, это Type, для которого он берет имя. Так что это эквивалентно передаче имени строки. И строго типизированная модель, которая должна совпадать, иначе она потерпит неудачу. Так что он на самом деле не знает слишком много о View - это просто хитрость, чтобы заставить компилятор ловить ошибки.