MVC EditorFor и Generics
У меня есть такая модель
class MyClass
{
}
class MyModel
{
public EditorModel<MyClass> EditorProperty { get; set; }
}
class EditorModel<T>
{
public int MyProp { get; set; }
}
и шаблон просмотра бритвы в папке EditorTemplates, как это
@model Project.EditorModel<MyClass>
@Html.DisplayFor(x => x.MyProp)
и индекс бритвы
@model Project.MyModel
@Html.EditorFor(x => x.EditorProperty)
Но когда я запускаю код для отображения шаблона, шаблон не отображается, вместо этого отображается строка с полным именем типа, используемого в качестве модели в представлении шаблона редактора.
Проблема в том, что метод EditorFor не поддерживает универсальные модели? Это можно обойти?
1 ответ
Я думаю, что проблема начинается с имени шаблона, который не может действительно удовлетворить шаблон имени общего класса. Таким образом, шаблон не выбирается автоматически.
метод EditorFor
также есть переопределение, где вы можете передать имя шаблона.
Что вы можете сделать, это обновить использование EditorFor
, предоставляя Имя шаблона, теперь уловка состоит в том, чтобы сделать эту часть динамической, и это также может быть частью вашего класса ViewModel:
@model Project.MyModel
@Html.EditorFor(x => x.EditorProperty, Model.TemplateName)
Вы должны продлить MyModel
обеспечить TemplateName
имущество. Теперь вам решать, как правильно определить имя. Вы можете сделать это именованным соглашением образца:
public string TemplateName
{
get
{
// EditorProperty must not be null... mind this is C#6 but its easy to downgrade it
var genericType = EditorProperty?.GetType().GetGenericArguments().FirstOrDefault()?.Name;
return $"EditorModelOf{genericType}";
}
}
А также TemplateName
например, вернется
EditorModelOfMyClass
Таким образом, вы должны назвать свой EditorTemplate EditorModelOfMyClass.cshtml
, Это будет работать только в том случае, если ожидаемое количество общих классов ограничено.