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, Это будет работать только в том случае, если ожидаемое количество общих классов ограничено.

Другие вопросы по тегам