我花了好一天的时间来解决一个密切相关的问题的答案-尽管我不确定这是否是完全相同的问题,但如果有人正在寻找解决同一问题的解决方案,我会在这里发布。

就我而言,我有一个抽象的基本类型,用于多种不同的视图模型类型。 因此,在主视图模型中,我具有抽象基本类型的属性:

class View

{

public AbstractBaseItemView ItemView { get; set; }

}

我有许多AbstractBaseItemView子类型,其中许多定义了自己的专有属性。

我的问题是,模型绑定器不查看附加到View.ItemView的对象的类型,而是仅查看声明的属性类型,即AbstractBaseItemView-并决定仅绑定在抽象类型中定义的属性, 忽略恰好在使用的特定于AbstractBaseItemView具体类型的属性。

解决方法不是很漂亮:

using System.ComponentModel;

using System.ComponentModel.DataAnnotations;

// ...

public class ModelBinder : DefaultModelBinder

{

// ...

override protected ICustomTypeDescriptor GetTypeDescriptor(ControllerContext controllerContext, ModelBindingContext bindingContext)

{

if (bindingContext.ModelType.IsAbstract && bindingContext.Model != null)

{

var concreteType = bindingContext.Model.GetType();

if (Nullable.GetUnderlyingType(concreteType) == null)

{

return new AssociatedMetadataTypeTypeDescriptionProvider(concreteType).GetTypeDescriptor(concreteType);

}

}

return base.GetTypeDescriptor(controllerContext, bindingContext);

}

// ...

}

尽管此更改让人感觉很棘手,而且非常“系统”,但它似乎有效-并且据我所知,它不会带来相当大的安全风险,因为它没有绑定到CreateModel()中,因此不允许您 发布任何内容并欺骗模型绑定器以创建任何对象。

它也仅在声明的property-type是抽象类型时才起作用,例如 抽象类或接口。

与此相关的是,在我看来,我在这里看到的覆盖CreateModel()的其他实现可能仅在发布全新的对象时才起作用-并且在声明的属性时也会遇到我遇到的相同问题 -type是抽象类型。 因此,您很可能将无法在现有模型对象上编辑具体类型的特定属性,而只能创建新的属性。

因此,换句话说,您可能需要将此替代方法集成到活页夹中,以便还能够正确地编辑在绑定之前添加到视图模型中的对象...就我个人而言,我认为这是一种更安全的方法,因为 我控制要添加的具体类型-因此,控制器/操作可以通过简单地用空实例填充属性来间接指定可能绑定的具体类型。

我希望这对其他人有帮助...

php mvc多态实例,asp.net mvc-多态模型绑定相关推荐

  1. 学习笔记 --- 工厂、单体、适配器、策略、观察者、MVC设计模式及ASP.NET MVC开发模式、关闭缓存的方法...

    关于工厂.单体.适配器.策略.观察者没啥好说的, 代码中有说明 //DesignPattern.cs View Code using System; using System.Collections. ...

  2. ASP.NET MVC 5 02 - ASP.NET MVC 1-5 各版本特点

    参考书籍:<ASP.NET MVC 4 高级编程>.<ASP.NET MVC 5 高级编程>.<C#高级编程(第8版)>.<使用ASP.NET MVC开发企业 ...

  3. mvc html validator,ASP.NET MVC实现Validation验证器扩展

    今天介绍在ASP.NET MVC实现Validation验证器扩展,通过使用Controller验证并不是最好的方法:验证过于分散,容易造成重复代码,不利于维护与扩展,因此本节将使用MVC默认绑定器( ...

  4. [导入]ASP.NET MVC框架开发系列课程(1):MVC模式与ASP.NET MVC框架概述.zip(8.80 MB)

    讲座内容: ASP.NET MVC框架是既ASP.NET WebForms后的又一种开发方式.它提供了一系列优秀特性,使ASP.NET开发人员拥有了另一个选择.本次课程将对MVC模式ASP.NET M ...

  5. php .net mvc,总是觉得asp.net MVC 写着很别扭,对比PHP的mvc,asp.net 麻烦很多?

    没写过php,但有ASP.NET MVC的开发经验,这里简单地说一下自己的理解. 首先通过一张图来看ASP.NET MVC的一个交互原理: Model层其实是一个很大的概念,包含了服务,业务逻辑,数据 ...

  6. mvc ajax helpers,ASP.NET MVC 实践系列4-Ajax应用

    ASP.NET MVC中支持Ajax的方式和webform中有些区别,没有了updatepanel,所以对于初学者来说在最开始应用时似乎没有在webform中简单,但实际使用上更为灵活而跟webfor ...

  7. asp.net mvc 点滴 一 asp.net mvc vs asp.net web forms

    MVC模式是一个大家很熟悉的设计模式,微软的asp.net mvc framework是给asp.net web forms提供了一个可替换的asp.net方案. Models:Model对象是程序的 ...

  8. asp.net+mvc+html辅助,ASP.NET MVC使用Ajax的辅助的解决方法

    前言:前面我们已经简单的介绍过了MVC如何Jquery,因为我们如果使用Ajax的话必须要了解Jquery,这篇博客我们将大致了解一下ASP.NET MVC如何使用Ajax的辅助方法,此博客是我的读书 ...

  9. mvc html dropdownlist,ASP.NET MVC中使用DropDownList地详解

    DropDownList控件又称下拉列表框控件,DropDownList控件动态连接到数据库,按指定 条件从数据库 中查询 出列表选项数据,然后绑 定到控件,可以方便快速地显示出多个下拉选 项 . 同 ...

最新文章

  1. 大数的减法函数--c语言
  2. geoserver css插件,GeoServer使用CSS定义地图样式-上手
  3. lazadashopee代运营服务有哪些,能帮商家解决哪些问题?
  4. 粗略。。类设计的基本经验3之笔记
  5. 在RH6.5上安装sublime3 build3103步骤
  6. Function(函数)
  7. CISCO安全 ×××技术
  8. Open XML之我见
  9. 如何测量C#代码的运行时间
  10. gsoap使用心得![转]
  11. 小米华为鸿蒙,华为鸿蒙比小米MIUI快,老外上手出结果
  12. excel vba系统下载_作品分享:《Excel VBA实用程序集(第2版)》下载
  13. java.util.LinkedHashMap cannot be cast to
  14. 爬虫 + 数据分析 - 7 CrawlSpider(全站爬取), 分布式, 增量式爬虫
  15. 无线局域网和蜂窝移动网络_手机连上无线网络后,应不应该关掉移动数据?
  16. 这个模型怎么划分网格?
  17. 重积分 | 第二类曲面积分投影法正负判断
  18. Python学习手册(致敬谢公子)
  19. Word更新所有域的代码
  20. git push 报错:remote: Permission to XXXA/xxxx.git denied to XXXB

热门文章

  1. IOS之学习笔记二(块)
  2. C和指针之数组和函数部分总结
  3. C语言之strstr函数类似Java字符串的contain函数
  4. Android之获取证书文件(pfx格式)的公钥和私钥
  5. LeetCode之Maximum Depth of Binary Tree
  6. Android之百度地图定位最详细使用总结
  7. Android之matrix类控制图片的旋转、缩放、移动
  8. 《零基础看得懂的C++入门教程 》——(1)第一个C++程序就让你知其所以然
  9. clob字段怎么导出_Oracle 11g及12c+版本下为啥有些表不能exp导出?
  10. 抛物面天线的工作原理是什么?