mvc html绑定变量,c# – Asp.Net MVC 3使用变量对象进行自定义模型绑定
我的实体:( 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使用变量对象进行自定义模型绑定相关推荐
- 用于将带有查询字符串的复杂对象传递到Web API方法的自定义模型绑定器
目录 介绍 查询复杂对象的字符串字段 使用和测试FieldValueModelBinder类 FieldValueModelBinder如何工作? 获取源字段和值 将字段部分与对象属性匹配 解析枚举类 ...
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第三篇
摘要 本文对ASP.NET MVC的全局运行机理进行一个简要的介绍,以使得朋友们更好的理解后续文章. 前言 在上一篇文章中,我们实现了第一个ASP.NET MVC页面.对于没有 ...
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面
摘要 本文首先一步一步完成Demo的第一个页面--首页.然后根据实现过程,说明一下其中用到的与ASP.NET MVC相关的概念与原理. 让第一个页面跑起来 现在,我们来实现公告 ...
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作
摘要 本文将简要介绍这个文章系列的目的.形式及大体内容.并且完成开始学习这个系列前所必要的准备工作. 前言 ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了 ...
- 第六篇:拦截器( MVC案例教程(基于ASP.NET MVC beta))
http://ljl-xyf.javaeye.com/blog/725196 摘要 本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论A ...
- iis mvc html,IIS中使用ASP.NET MVC的经验总结
在这篇文章中我们学习在不同版本的IIS中使用ASP.NET MVC和URL Routing.我们学习针对IIS7.0.IIS6.0和更早版本的IIS的处理策略. ASP.NET MVC框架依赖于URL ...
- ASP.NET MVC 自定义模型绑定1 - 自动把以英文逗号分隔的 ID 字符串绑定成 Listint...
直接贴代码了: CommaSeparatedModelBinder.cs using System; using System.Collections; using System.Collection ...
- mvc npoi导出excel ajax,ASP.Net MVC利用NPOI导入导出Excel
因近期项目遇到所以记录一下: 首先导出Excel: 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// /// 批 ...
- ASP.NET MVC 1.0 转化为ASP.NET MVC 2.0的方法
安装了VS2010的人估计都比较头疼那些MVC1.0的项目无法再MVC2.0里面打开.毕竟网上大部分例子还是1.0的. 转化方法1: 微软官网推荐的. a. 备份你需要转化的项目文件. b.使用记事本 ...
最新文章
- CLAMAV 杀毒软件安装及使用配置
- 【Linux】一步一步学Linux——host命令(162)
- 详解DNS正向解析实验(有图有实验)
- Linux中输入输出重定向和管道
- 安卓开发——锁定软件——输入密码后重复弹出输入密码窗口的解决方法
- iOS开发拓展篇—UIDynamic(捕捉行为)
- 微型计算机音乐发生器,基于51单片机的音乐发生器的设计最终版(全文完整版)...
- Linux黑客基础01篇
- 深度森林:探索深度神经网络以外的方法
- 蓝牙定位原理-灵思科
- 什么表示计算机的存储容量,存储容量
- 白苹果了怎么办_iOS更新白苹果处理及第三方售后吐槽
- 在线考试系统微信小程序的实现(一)
- 必背C语言算法 C语言小写转大写
- 2022内蒙古最新建筑施工塔式起重机(建筑特种作业)模拟考试题库及答案
- HTML5+CSS期末大作业:运动体育网站设计主题——体育铅球(5页)带注册 期末作业HTML代码
- 自媒体人写稿必备的工具
- PureMVC 实例讲解
- 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止.
- Oracle 数据库一体机:zData Light - 分布式存储管理平台
热门文章
- 七阶拉丁方阵_【C语言】输出N阶拉丁方阵并统计个数
- python的knn算法list_[机器学习]kNN算法python实现(实例:数字识别)
- 多址接入技术TDMA CDMA FDMA Aloha等
- 能导出_Handoff 插件上线!足不出 Figma 就能导出设计标注
- 计算机考研需要看数据库吗,05报考华中科技计算机系数据库所的我复试经历
- hive 修改分区备注_hive修改 表/分区语句
- 日历控件如何切换语言 vant_看看甘特图控件VARCHART XGantt的亮点
- Simpy学习:基本运行与终止(一)
- snipaste如何滚动截图_每天都在用的QQ截图,居然升级了这么多实用功能!
- 基于Consul的数据库高可用架构【转】