Могу ли я сослаться на параметр типа в представлении MVC? - PullRequest
1 голос
/ 29 марта 2011

При наличии строго типизированного представления в ASP.Net MVC можно ли ссылаться на параметр типа, используемый для объявления представления?

Например, если страница объявлена ​​как

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyProject.MyViewModel>" %>

можно ли ссылаться на параметр типа в ViewPage<TModel>?

Я знаю, что могу сделать Model.GetType(), но у меня есть ситуация, когда у меня есть одна модель представления, полученная из другой, и обе используютта же точка зрения.В настоящее время у меня есть строка типа

<% if (Model.GetType().IsSubclassOf(typeof(MyViewModel)))
   { %>

, чтобы определить, используется ли представление для отображения производной модели, но я бы хотел сделать это без жесткого кодирования вызова typeof(...).

Я хочу сделать что-то вроде Model.GetType().IsSubclassOf(typeof(TModel))

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Если вы создаете свой собственный базовый класс, вы можете выставить тип модели через свойство:

public class BaseViewPage<TModel> : ViewPage<TModel>
{
    public Type ModelType { get { return typeof(TModel); } }
}

Измените

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyProject.MyViewModel>" %>

на

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="MyProject.BaseViewPage<MyProject.MyViewModel>" %>

Тип модели предоставляется через this.ModelType

1 голос
/ 29 марта 2011

Это должно дать вам экземпляр объекта типа для TModel

this.GetType().BaseType.GetGenericArguments()[0]

.BaseType () необходим, поскольку 'this' на самом деле соответствует классу, сгенерированному для вашего представления .aspx asp.net во время выполнения.

Итак, this.GetType (). BaseType должен дать вам объект типа для System.Web.Mvc.ViewPage

1 голос
/ 29 марта 2011

Из документации MSDN на ViewPage (TModel) :

Model - Получает свойство Model связанного объекта ViewDataDictionary.

Получение типа из свойства Model vis Model.GetType() не дороже, чем TModel is typeof(X). Как указал Джидди , в своем комментарии нет реальной ценности знать тип TModel, поскольку вам все равно придется провести сравнение if.

Это говорит о том, что я буду изучать архитектуру вашего приложения, так как здесь, похоже, пахнет кодом. Я делаю предположение, но кажется, что вы используете одно и то же представление с двумя разными моделями, но отображаете разные данные в зависимости от типа модели. Чтобы избежать подобных проблем, моя команда должна следовать одна модель на правило . Это имеет тенденцию держать ваши модели и представления краткими. Благодаря эффективному использованию частичных функций вы даже не чувствуете ограничения.

...