之前在早期版本的MVC中已经提出过这个问题.还有一篇关于解决问题的方法的博客文章.我想知道MVC3是否引入了任何可能有用的东西,或者是否还有其他选择.
简而言之.这是情况.我有一个抽象的基本模型和2个具体的子类.我有一个强类型视图,用于渲染模型EditorForModel()
.然后我有自定义模板来呈现每个具体类型.
问题来自发布时间.如果我使post post方法取基类作为参数,那么MVC不能创建它的抽象版本(我不想要它,我希望它创建实际的具体类型).如果我创建多个仅通过参数签名变化的后期操作方法,那么MVC会抱怨它不明确.
据我所知,我对如何解决这个问题有一些选择.我出于各种原因不喜欢它们,但我会在这里列出它们:
我不喜欢1,因为它基本上是隐藏的配置.其他一些开发代码的开发人员可能不知道它并浪费了大量时间来弄清楚为什么在更改内容时会出现问题.
我不喜欢2,因为它似乎有点hacky.但是,我倾向于这种方法.
我不喜欢3,因为这意味着违反DRY.
还有其他建议吗?
编辑:
我决定采用达林的方法,但稍作改动.我把它添加到我的抽象模型中:
[HiddenInput(DisplayValue = false)]
public string ConcreteModelType { get { return this.GetType().ToString(); }}
Run Code Online (Sandbox Code Playgroud)
然后隐藏自动生成我的DisplayForModel()
.你唯一需要记住的是,如果你不使用DisplayForModel()
,你必须自己添加它.
假设我有一个Product模型,Product模型具有ProductSubType(abstract)的属性,我们有两个具体的实现Shirt和Pants.
这是来源:
public class Product
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public decimal? Price { get; set; }
[Required]
public int? ProductType { get; set; }
public ProductTypeBase SubProduct { get; set; }
}
public abstract class ProductTypeBase { }
public class Shirt : ProductTypeBase
{
[Required]
public string Color { get; set; }
public bool HasSleeves { get; set; }
}
public class Pants : ProductTypeBase
{
[Required] …
Run Code Online (Sandbox Code Playgroud)