2010-01-07 1 views
3

Я написал шаблон редактора List`1 для использования с методами расширения EditorFor (MVC2), однако я столкнулся с проблемами при использовании generics + null объектов.ASP.NET MVC View/Partial с generics

Учитывая модель

class MyModel { 
    public Foo SomeFoo { get;set; } 
    public List<Foo> SomeFooList { get;set; } 
} 

и шаблон в /Views/Shared/EditorTemplates/List`1.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 

<% 
    IEnumerable enumerableModel; 
    if (Model != null && (enumerableModel = Model as IEnumerable) != null) 
    { 
     foreach (var v in enumerableModel) 
     { 
      var model = v; 
      Response.Write(Html.EditorFor(m => model)); 
     } 
    } 
%> 

я получить ожидаемый редактор для SomeFoo, а также любые элементы SomeFooList которые не являются нулевыми, так как тип ModelMetaData будет «Foo». Однако, если у меня есть «null» как один из объектов в SomeFooList, я не получаю ничего визуализированного, поскольку модель имеет тип «объект», а не Foo или более общий T из общих аргументов моего списка.

По существу я хотел бы добиться чего-то вроде

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<T>> where T : class" %> 

, так что я знаю, типы моего списка.

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

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

Любые мысли?

Update:

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

if (Model != null && (enumerableModel = Model as IEnumerable) != null) 
    { 
     Type listType = null; 

     if (enumerableModel.GetType().IsGenericType) 
     { 
      listType = enumerableModel.GetType().GetGenericArguments()[0]; 
     } 

     foreach (var v in enumerableModel) 
     { 
      var model = v; 
      if (model == null && listType != null) 
       model = Activator.CreateInstance(listType); 
      Response.Write(Html.EditorFor(m => model)); 
     } 
    } 

Амар

ответ

1

Может быть, вы могли бы подумать о создании пользовательской структуры, аналогичной Nullable<T> содержать ваше лицо? Nullable<T> указывает, что T является структурой, поэтому вам нужно создать свой собственный. Таким образом вы можете проверить свойство HasValue, а не иметь проблему с проверкой null и не зная тип.

+0

Кстати, если кто-то может показать мне, как правильно писать Nullable < T > в этой уценке, не вставая в пробелы, я был бы великолепен! – Charlie

+1

Оберните его в backticks ('\' '), и вы получите' Nullable '. – LukeH

+0

Это кажется справедливым, у меня будет игра с этим завтра и посмотрю, смогу ли я получить от нее что-нибудь. ура – amarsuperstar

 Смежные вопросы

  • Нет связанных вопросов^_^