Asp.net Mvc Codeplex Preview 5 第三篇 实现Action参数传递繁杂类型 【转】

Asp.net Mvc Codeplex Preview 5 第三篇 实现Action参数传递繁杂类型 【转】

本文的环境是Asp.net Mvc Codeplex Preview 5

 

前文提到我们可以使用 Controller中的UpdateModel来获取 繁杂类型

例如

 

1
UpdateModel(x, Request.Form.AllKeys);

但是这里有些问题,当我们使用Request.Form.AllKeys时,提交的数据中有非x属性时,就会发生错误

The model of type MyModel does not have a property named Name2.

但是使用

1 
UpdateModel(x, 
new
[] {


IDX



Name

});

这种形式,我们又会觉得它太过麻烦。

 

其实Asp.net Mvc为我们提供了一种很简单的传递复杂数据的方式,它类似于Monorail中的DataBinder:

我们完全可以通过以下方式来传递数据。例如

 view:

1 
    
<%
using (Html.Form(

home



about

, FormMethod.Post)) {

%>


2 
    
<%
=
Html.TextBox(

my.ID

)
%>


3 
    
<%
=
Html.TextBox(

my.Name

)
%>


4 
    
<%
=
Html.SubmitButton()
%>


5 
    
<%

%>

 controller:

        [AcceptVerbs(

post

)]
        

public
 ActionResult About([ModelBinder(
typeof
(MyModelBinder))]MyModel my) {

            ViewData[


Title


=
my.Name 
+
 my.ID;
            

return
 View();
        }

 这样我们就可以从my中获取到Post过来的值了,这里的关键在于[ModelBinder(typeof(MyModelBinder))]

 

而 MyModelBinder的实现方法如下

 

 1 
using
 System;

 2 
using
 System.Collections.Generic;

 3 
using
 System.ComponentModel;

 4 
using
 System.Globalization;

 5 
using
 System.Linq;

 6 
using
 System.Web.Mvc;

 7 


 8 
///
 
<summary>


 9 
///
 这个类是根据Controller.UpdateModel方法更改而成

10 
///
 
</summary>


11 
public
 
class
 MyModelBinder : IModelBinder{


12 
    
#region
 IModelBinder 成员


13 


14 
    
public
 
object
 GetValue(ControllerContext controllerContext, 
string
 modelName, Type modelType,

15 
                           ModelStateDictionary modelState){


16 
        
object
 model 
=
 Activator.CreateInstance(modelType); 
//
将做为参数的类实例化了


17 
        IEnumerable
<
string
>
 keys 
=
 modelType.GetProperties().Select(c 
=>
 c.Name); 
//
得到该对象的属性的名的字符串数组,这里的结果应该为[“ID”,”Name”]


18 
        
string
 objectPrefix 
=
 modelName; 
//
这个就是,我的对象名叫my则会检查  name=”my.ID” name=”my.Name”的表单字段


19 


20 
        PropertyDescriptorCollection properties 
=
 TypeDescriptor.GetProperties(model); 
//
对象的属性的集合


21 
        var dictionary 
=
 
new
 Dictionary
<
string
, PropertyDescriptor
>
();

22 
        
foreach
 (
string
 str 
in
 keys){


23 
//
遍历属性的字符串集合即[“ID”,”Name”]


24 
            
if
 (
!
string
.IsNullOrEmpty(str)){


25 
                PropertyDescriptor descriptor 
=
 properties.Find(str, 
true
);

26 
                
if
 (descriptor 
==
 
null
){


27 
                    
throw
 
new
 ArgumentException(

28 
                        
string
.Format(CultureInfo.CurrentUICulture, 

无此属性{0},{1}


new
 
object
[]{model.GetType().FullName, str}),

29 
                        

modelName

);

30 
                }

31 
                
string
 str3 
=
 
string
.IsNullOrEmpty(objectPrefix) 
?
 str : (objectPrefix 
+
 

.

 
+
 str); 
//
将对象名与属性名拼接,如my.ID


32 
                dictionary[str3] 
=
 descriptor;

33 
            }

34 
        }

35 
        
foreach
 (var pair 
in
 dictionary){


36 
            
string
 key 
=
 pair.Key;

37 
            PropertyDescriptor descriptor2 
=
 pair.Value;

38 
            
object
 obj2 
=
 ModelBinders.GetBinder(descriptor2.PropertyType).GetValue(controllerContext, key,

39 
                                                                                    descriptor2.PropertyType, modelState);

40 
            
if
 (obj2 
!=
 
null
){


41 
                
try
{


42 
                    descriptor2.SetValue(model, obj2); 
//
设置属性的值


43 
                    
continue
;

44 
                }

45 
                
catch
{


46 
                    
//
如果有使用验证Helepr则会显示在Html.ValidationSummary中


47 
                    
string
 errorMessage 
=
 
string
.Format(CultureInfo.CurrentCulture, 

验证失败{0}:{1}


new
[]{obj2, descriptor2.Name});

48 
                    
string
 attemptedValue 
=
 Convert.ToString(obj2, CultureInfo.CurrentCulture);

49 
                    modelState.AddModelError(key, attemptedValue, errorMessage);

50 
                    
continue
;

51 
                }

52 
            }

53 
        }

54 
        
return
 model; 
//
最后 返回这个我们设置完属性的对象


55 
    }

56 


57 
    
#endregion


58 
}

 

这样我们就实现了 用Action的参数传递复杂类型。

 

当然,如果你连[ModelBinder(typeof(MyModelBinder))]都不想写了,想直接来以下写法,

1 
        [AcceptVerbs(

post

)]

2 
        
public
 ActionResult About(MyModel my) {


3 
            ViewData[

Title


=
my.Name 
+
 my.ID;

4 
            
return
 View();

5 
        }

 

这个也是可以的不过你要在Application_Start中添加

ModelBinders.Binders.Add(typeof (MyModel), new MyModelBinder());

来表示二者的绑定关系。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110860.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 网络协议 概念

    网络协议 概念

    2021年10月10日
    49
  • php 监听端口数据客户端ip_PHP获取客户端和服务器端IP[通俗易懂]

    客户端的ip变量:$_SERVER[‘REMOTE_ADDR’]:客户端IP,也有可能是代理IP$_SERVER[‘HTTP_CLIENT_IP’]:代理端的IP,可能存在,也可能伪造$_SERVER[‘HTTP_X_FORWARD_FOR’]:用户在哪个ip上使用的id,可能存在,也可能伪造服务端的ip变量:$_SERVER[‘SERVER_NAME’]:需要使用函数gethostname…

    2022年4月17日
    51
  • mybatiscodehelperpro 激活码(注册激活)

    (mybatiscodehelperpro 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日
    1.3K
  • 《QTreeView+QAbstractItemModel自定义模型》:系列教程之三[通俗易懂]

    《QTreeView+QAbstractItemModel自定义模型》:系列教程之三[通俗易懂]1、了解常用的model类通过对上一节的阅读,我们知道只要具备model+view就可以显示数据。那么有哪些model类呢,从下图中我们可以看到Qt中模型类的层次结构QStandardItemModel:可以作为QListView、QTableView、QTreeView的标准model。QAbstractListModel:需要使用QListView显示数据,并配合自定义…

    2022年6月14日
    63
  • 洗水管理系统_洗衣店信息管理系统课设

    洗水管理系统_洗衣店信息管理系统课设技术:Java、JSP等摘要:随着人们对生活物质的追求,人们对穿着有了更加深刻的体会以及认识,很多高档的服装可以给人们带来气质方面的展现和心情的愉悦。然后,对于高档服装的清洗也成为了实际性的问题,为此很多人们选择送去洗衣店去清洗,其目的是既清洗的干净,而且还方便。这就给洗衣店带来非常大的管理压力,尤其是记录用户的收费信息等。本次系统设计之初就考虑到这一点来进行需求调查的,系统主要的模块由用户登录模块,注册模块,办卡管理,充值管理,寄存衣服办理,报表统计管理等基本实现功能模块,系统主要采取的是B/S开发模式

    2025年6月18日
    0
  • mongodb存储的数据类型(redis存储数据类型)

    MongoDB数据存储结构1.基本概念在MongoDB中数据存储的基本概念是数据库、集合、文档。文档(document)是MongoDB中数据的基本存储单元,非常类似与关系型数据库管理系统中的行,当更有表现力。集合(collection)可以看作是一个拥有动态模式(dynamicschema)的表。MongoDB的一个实例可以拥有多个相互独立的数据库(database),每一…

    2022年4月13日
    440

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号