c# - MVC - 具有接口(interface)和注释的嵌套模型

标签 c# asp.net asp.net-mvc asp.net-mvc-4 razor

我有基础课:

public abstract class AbstractBaseModel : IModel
{
    [Display(Name = "Some Name")]
    [DisplayFormat(DataFormatString = "{0:d0}")]
    [RegularExpression(@"[0-9]{1,10}", ErrorMessage = "error")]
    public virtual string SomeName{ get; set; }
}

IModel 接口(interface)只是简单的属性声明:

public interface IModel
{
    string SomeName{ get; set; }
}

从基本模型中我有 2 个派生模型

public class ClientModel : AbstractBaseModel
{
    [Required(ErrorMessage = "Some error message for customer only")]
    public override string SomeName{ get; set; }
}

public class PowerUserModel : AbstractBaseModel
{
    [Required(ErrorMessage = "Different message for the admin")]
    public override string SomeName{ get; set; }
}

这个模型,或者更确切地说,接口(interface)是另一个组合了多个模型的模型的一部分:

public class ComboEndModel
{
     public IModel Model { get; set; }
     public IDifferentModel DifferentModel { get; set; }
}

根据当前使用的 View/Controler,我将新的 ClientModelPowerUserModel 作为ComboEndModel 中的模型

渲染 View 时,我仅从基本抽象模型获取注释,而不是在派生类型中添加的注释。我怀疑这是因为我使用接口(interface)作为嵌套模型属性而不是类型。

实现这种关系的正确方法是什么,或者使用不正确的注释解决问题?我应该尝试使用自定义绑定(bind)吗?

最佳答案

可能对您有用的一件事是为每个派生模型创建编辑器模板。

如果你像这样定义你的 ComboEndModel

var model = new ComboEndModel() { Model = new PowerUserModel() };
return View(model);

并且在您看来,您使用 EditorFor

@model WebApplication.Models.ComboEndModel
@Html.EditorFor(m => m.Model)

根据类型模型是什么,它将选择关联的编辑器模板并应用该派生类型的注释。在这种情况下,您需要在 EditorTemplates 文件夹中使用名为 PowerUserModel.cshtml 且模型类型为 PowerUserModel

的部分 View

关于c# - MVC - 具有接口(interface)和注释的嵌套模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275957/

相关文章:

c# - 远程调试 - .NET Core 调试器不支持 Windows PDB - 如何正确发布?

c# - 是否可以使用匿名类型进行数据绑定(bind)?

asp.net - 奇怪的 URL 绕过路由,括号大写字母括号任何两个右括号

asp.net-mvc - ASP.NET MVC 组合下拉框

c# - TFS 找不到路径的一部分

c# - 来自 Application_Error() 的异步调用

c# - 将 args(参数)传递到窗口窗体应用程序

c# - 首次加载页面时如何检查复选框列表中的所有复选框?

c# - MVC模型是Poco类,结构有数据还是业务层?

c# - 将一个简单的字符串从 Controller 传递到 View MVC3