Я написал шаблон редактора 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));
}
}
Амар
Кстати, если кто-то может показать мне, как правильно писать Nullable < T > в этой уценке, не вставая в пробелы, я был бы великолепен! – Charlie
Оберните его в backticks ('\' '), и вы получите' Nullable '. –
LukeH
Это кажется справедливым, у меня будет игра с этим завтра и посмотрю, смогу ли я получить от нее что-нибудь. ура – amarsuperstar