我的实体:( PersonModel应该有一个AddressOne或AddressTwo类型的地址(可能还有其他),所以PersonModel有一个地址字段的对象类型.)

public class Person

{

public int PersonId { get; set; }

public string Name { get; set; }

public string Surname { get; set; }

public object Address { get; set; }

}

public class AddressOne

{

public string Street { get; set; }

public string City { get; set; }

}

public class AddressTwo

{

public string Province { get; set; }

public string State { get; set; }

}

模型:(我在typeOfAddress中传递一个隐藏字段,以匹配表单提交后的正确地址)

public class PersonModel

{

private System.Type _typeOfAddress;

private object _address;

[Required]

public int PersonId { get; set; }

[Required]

public string Name { get; set; }

[Required]

public string Surname { get; set; }

public System.Type typeOfAddress

{

get { return _typeOfAddress; }

set { _typeOfAddress = value; }

}

public object Address

{

get {

return _address;

}

set {

_address = value;

_typeOfAddress = _address.GetType();

}

}

}

public class AddressOneModel

{

[Required]

public string Street { get; set; }

[Required]

public string City { get; set; }

}

public class AddressTwoModel

{

[Required]

public string Province { get; set; }

[Required]

public string State { get; set; }

}

我的观点(对于地址栏我有广告编辑模板,在此代码中省略):

@using (Html.BeginForm()) {

  • PersonId: @Html.EditorFor(model => model.PersonId)

  • Name: @Html.EditorFor(model => model.Name)

  • Surname: @Html.EditorFor(model => model.Surname)

  • Address:

  • @Html.HiddenFor(model => model.typeOfAddress)

    @Html.EditorFor(model => model.Address)

Submit

}

然后是我的控制器:(在这个例子中我在模型中加载了AddressOne,但应该是一个或两个取决于运行时……)

[HttpGet]

public ActionResult Index()

{

PersonModel myPerson = new PersonModel();

myPerson.PersonId = 1;

myPerson.Name = "Michael";

myPerson.Surname = "Douglas";

AddressOneModel Address = new AddressOneModel();

Address.Street = "5th Avenue";

Address.City = "New York";

myPerson.Address = Address;

return View(myPerson);

}

[HttpPost]

public ActionResult Index([ModelBinder(typeof(PersonModelBinder))]PersonModel myPerson)

{

if (ModelState.IsValid) {

// some things here

}

return View();

}

然后是PersonModel的Model Binder:

public class PersonModelBinder : IModelBinder

{

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)

{

PersonModel bindedModel = new PersonModel();

foreach (var Property in typeof(PersonModel).GetProperties())

{

PropertyInfo info = bindedModel.GetType().GetProperty(Property.Name);

object castedInfo = new object();

var uType = info.PropertyType;

if (uType == typeof(string))

{

castedInfo = bindingContext.ValueProvider.GetValue(Property.Name).AttemptedValue.ToString();

}

else if (uType == typeof(Type))

{

castedInfo = Type.GetType(bindingContext.ValueProvider.GetValue(Property.Name).AttemptedValue.ToString());

}

else if (uType == typeof(object))

{

string objType = bindingContext.ValueProvider.GetValue("typeOfAddress").AttemptedValue;

object address = (object)Activator.CreateInstance(Type.GetType(objType));

// another foreach as previous

}

else

{

object uCasted = (object)Activator.CreateInstance(info.PropertyType);

uCasted = Convert.ChangeType(bindingContext.ValueProvider.GetValue(Property.Name).AttemptedValue, Property.PropertyType);

castedInfo = uCasted;

}

info.SetValue(bindedModel, castedInfo, null);

}

return bindedModel;

}

这是实现PersonModel绑定的正确方法吗?那么[Post]控制器中的验证呢?

我也看到了一种以这种方式使用DefaultBinder的方法:

[ModelBinderType(typeof(PersonModel))]

public class PersonModelBinder : DefaultModelBinder

{

//...

}

但我没有在MVC3中找到任何ModelBinderType的参考!有什么建议吗?

mvc html绑定变量,c# – Asp.Net MVC 3使用变量对象进行自定义模型绑定相关推荐

  1. 用于将带有查询字符串的复杂对象传递到Web API方法的自定义模型绑定器

    目录 介绍 查询复杂对象的字符串字段 使用和测试FieldValueModelBinder类 FieldValueModelBinder如何工作? 获取源字段和值 将字段部分与对象属性匹配 解析枚举类 ...

  2. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第三篇

    摘要       本文对ASP.NET MVC的全局运行机理进行一个简要的介绍,以使得朋友们更好的理解后续文章. 前言       在上一篇文章中,我们实现了第一个ASP.NET MVC页面.对于没有 ...

  3. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面

    摘要       本文首先一步一步完成Demo的第一个页面--首页.然后根据实现过程,说明一下其中用到的与ASP.NET MVC相关的概念与原理. 让第一个页面跑起来       现在,我们来实现公告 ...

  4. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作

    摘要       本文将简要介绍这个文章系列的目的.形式及大体内容.并且完成开始学习这个系列前所必要的准备工作. 前言       ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了 ...

  5. 第六篇:拦截器( MVC案例教程(基于ASP.NET MVC beta))

    http://ljl-xyf.javaeye.com/blog/725196 摘要       本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论A ...

  6. iis mvc html,IIS中使用ASP.NET MVC的经验总结

    在这篇文章中我们学习在不同版本的IIS中使用ASP.NET MVC和URL Routing.我们学习针对IIS7.0.IIS6.0和更早版本的IIS的处理策略. ASP.NET MVC框架依赖于URL ...

  7. ASP.NET MVC 自定义模型绑定1 - 自动把以英文逗号分隔的 ID 字符串绑定成 Listint...

    直接贴代码了: CommaSeparatedModelBinder.cs using System; using System.Collections; using System.Collection ...

  8. mvc npoi导出excel ajax,ASP.Net MVC利用NPOI导入导出Excel

    因近期项目遇到所以记录一下: 首先导出Excel: 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// /// 批 ...

  9. ASP.NET MVC 1.0 转化为ASP.NET MVC 2.0的方法

    安装了VS2010的人估计都比较头疼那些MVC1.0的项目无法再MVC2.0里面打开.毕竟网上大部分例子还是1.0的. 转化方法1: 微软官网推荐的. a. 备份你需要转化的项目文件. b.使用记事本 ...

最新文章

  1. CLAMAV 杀毒软件安装及使用配置
  2. 【Linux】一步一步学Linux——host命令(162)
  3. 详解DNS正向解析实验(有图有实验)
  4. Linux中输入输出重定向和管道
  5. 安卓开发——锁定软件——输入密码后重复弹出输入密码窗口的解决方法
  6. iOS开发拓展篇—UIDynamic(捕捉行为)
  7. 微型计算机音乐发生器,基于51单片机的音乐发生器的设计最终版(全文完整版)...
  8. Linux黑客基础01篇
  9. 深度森林:探索深度神经网络以外的方法
  10. 蓝牙定位原理-灵思科
  11. 什么表示计算机的存储容量,存储容量
  12. 白苹果了怎么办_iOS更新白苹果处理及第三方售后吐槽
  13. 在线考试系统微信小程序的实现(一)
  14. 必背C语言算法 C语言小写转大写
  15. 2022内蒙古最新建筑施工塔式起重机(建筑特种作业)模拟考试题库及答案
  16. HTML5+CSS期末大作业:运动体育网站设计主题——体育铅球(5页)带注册 期末作业HTML代码
  17. 自媒体人写稿必备的工具
  18. PureMVC 实例讲解
  19. 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止.
  20. Oracle 数据库一体机:zData Light - 分布式存储管理平台

热门文章

  1. 七阶拉丁方阵_【C语言】输出N阶拉丁方阵并统计个数
  2. python的knn算法list_[机器学习]kNN算法python实现(实例:数字识别)
  3. 多址接入技术TDMA CDMA FDMA Aloha等
  4. 能导出_Handoff 插件上线!足不出 Figma 就能导出设计标注
  5. 计算机考研需要看数据库吗,05报考华中科技计算机系数据库所的我复试经历
  6. hive 修改分区备注_hive修改 表/分区语句
  7. 日历控件如何切换语言 vant_看看甘特图控件VARCHART XGantt的亮点
  8. Simpy学习:基本运行与终止(一)
  9. snipaste如何滚动截图_每天都在用的QQ截图,居然升级了这么多实用功能!
  10. 基于Consul的数据库高可用架构【转】