Модель вложенного представления - изменение сгенерированного имени полей ввода с помощью EditorFor HTML-helper - PullRequest
0 голосов
/ 11 июня 2018

В последнее время, наткнувшись на некоторые CQRS, я хотел отделить концепцию модели представления от концепции запроса (команды), где команда - это то, что публикуется на сервере.Например, у меня нет причин включать списки выбора в то, что публикуется на сервере.Пытаясь это, у меня были некоторые проблемы с дизайном, особенно при игре с MVC-представлениями.

В моей системе есть сложная авторизация на основе ролей, и для этого мне нужно 6 различных представлений для редактирования члена.Все эти представления редактируют личную информацию точно так же, поэтому я создал для нее шаблон редактора.Шаблон редактора имеет модель представления как модель, а не команду.Это потому, что мне нужен список выбора в шаблоне редактора.Это работает хорошо, пока не дойдет до привязки модели - из-за неправильных входных имен.Я знаю, что могу написать входные имена вручную с помощью @ Html.Editor, но я бы предпочел этого не делать.

Мои классы, приведенные ниже, сильно уменьшены для удобства чтения, свойств намного больше.

У меня естьпредставление для редактирования члена.Вот его модель представления:

namespace Features.Members.Edit.AsAdmin
{
    public class ViewModel
    {
        public Command Command { get; set; }
        public PersonalInfoViewModel PersonalInfo 
            => new PersonalInfoViewModel {Command = Command.PersonalInfo };
    }
    public class Command
    {
        public PersonalInfoCommand PersonalInfo { get; set; }
    }
}

У меня есть шаблон редактора для PersonalInfoViewModel.cs, который я использую в главном представлении:

@Html.EditorFor(x => x.PersonalInfo)

Другие классы:

namespace Features.Members.Shared.Form.ViewModels
{
    public class PersonalInfoViewModel
    {
        public PersonalInfoCommand Command { get; set; }
        public SelectList BusinessAreas { get; set; }
    }
}


namespace Features.Members.Shared.Form.Commands
{
    public class PersonalInfoCommand
    {
        public int? BusinessAreaId { get; }
    }
}

Теперь мне нужны входы редактора шаблонов для привязки модели к основной Команде.Это означает, что имя входа должно быть:

PersonalInfo.BusinessAreaId

Однако сгенерированные имена полей ввода выглядят так:

<select class="form-control" id="PersonalInfo_Command_BusinessAreaId" name="PersonalInfo.Command.BusinessAreaId"></select>

Можно ли изменить сгенерированные имена ввода?Разве этот дизайн MVC не хорош?Есть ли альтернативы?

...