我有基础课:
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
,我将新的 ClientModel
或 PowerUserModel
作为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
关于c# - MVC - 具有接口(interface)和注释的嵌套模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275957/