嵌套视图模型 - 使用EditorFor HTML-helper修改输入字段的生成名称

时间:2018-06-10 23:11:19

标签: asp.net-mvc input viewmodel model-binding mvc-editor-templates

最近,通过绊倒一些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设计不好吗?还有其他选择吗?

0 个答案:

没有答案
相关问题