• .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)


    前言

    刚开始做AJAX应用的时候,经常要手工解析客户端传递的参数,这个过程极其无聊,而且代码中充斥着:Request["xxx"]之类的代码。

    这篇文章的目的就是告诉初学者如何自动将客户端用AJAX发送的参数自动绑定为强类型的成员属性或方法参数。

    自动绑定到ASPX和ASHX

    框架支持

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Happy.Web
     8 {
     9     public interface IWantAutoBindProperty
    10     {
    11     }
    12 }
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Happy.Web
     8 {
     9     [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
    10     public sealed class AutoBind : Attribute
    11     {
    12     }
    13 }
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 using System.Web;
     8 
     9 using Newtonsoft.Json;
    10 
    11 using Happy.ExtensionMethods.Reflection;
    12 
    13 namespace Happy.Web
    14 {
    15     public class JsonBinderModule : IHttpModule
    16     {
    17         public void Init(HttpApplication context)
    18         {
    19             context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
    20         }
    21 
    22         private void OnPreRequestHandlerExecute(object sender, EventArgs e)
    23         {
    24             if (!(HttpContext.Current.CurrentHandler is IWantAutoBindProperty))
    25             {
    26                 return;
    27             }
    28 
    29             var properties = HttpContext.Current.CurrentHandler.GetType().GetProperties();
    30 
    31             foreach (var property in properties)
    32             {
    33                 if (!property.IsDefined(typeof(AutoBind), true))
    34                 {
    35                     continue;
    36                 }
    37 
    38                 string json = HttpContext.Current.Request[property.Name];
    39 
    40                 var value = JsonConvert.DeserializeObject(json, property.PropertyType);
    41 
    42                 property.SetValue(HttpContext.Current.Handler, value);
    43             }
    44         }
    45 
    46         public void Dispose()
    47         {
    48         }
    49     }
    50 }

    代码示例

     1 <?xml version="1.0" encoding="utf-8"?>
     2 
     3 <configuration>
     4 
     5     <system.web>
     6       <compilation debug="false" targetFramework="4.0" />
     7       <httpModules>
     8         <add name="JsonBinderModule" type="Happy.Web.JsonBinderModule"/>
     9       </httpModules>
    10     </system.web>
    11 
    12 </configuration>
     1 /// <reference path="../ext-all-debug-w-comments.js" />
     2 var data = {
     3     Name: '段光伟',
     4     Age: 28
     5 };
     6 
     7 Ext.Ajax.request({
     8     url: '../handlers/JsonBinderTest.ashx',
     9     method: 'POST',
    10     params: { user: Ext.encode(data) }
    11 });
     1 <%@ WebHandler Language="C#" Class="JsonBinderTest" %>
     2 
     3 using System;
     4 using System.Web;
     5 
     6 using Happy.Web;
     7 
     8 public class JsonBinderTest : IHttpHandler, IWantAutoBindProperty
     9 {
    10     [AutoBind]
    11     public User user { get; set; }
    12 
    13     public void ProcessRequest(HttpContext context)
    14     {
    15         context.Response.ContentType = "text/plain";
    16         context.Response.Write(string.Format("姓名:{0},年龄:{1}", user.Name, user.Age));
    17     }
    18 
    19     public bool IsReusable
    20     {
    21         get
    22         {
    23             return false;
    24         }
    25     }
    26 }
    27 
    28 public class User
    29 {
    30     public string Name { get; set; }
    31 
    32     public int Age { get; set; }
    33 }

    运行结果

    自动绑定到MVC

    框架支持

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 using System.Web.Mvc;
     8 
     9 using Newtonsoft.Json;
    10 
    11 namespace Tenoner.Web.Mvc
    12 {
    13     public class JsonBinder : IModelBinder
    14     {
    15         public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    16         {
    17             string json = controllerContext.HttpContext.Request[bindingContext.ModelName];
    18 
    19             return JsonConvert.DeserializeObject(json, bindingContext.ModelType);
    20         }
    21     }
    22 }

    代码示例

    此处省略代码示例,有兴趣的朋友请留言交流。

    备注

    有些朋友应该能想到,这种模式不止能用在AJAX场景,其它场景也可以使用。

  • 相关阅读:
    MongoDB高级操作
    MongoDB基本操作
    Python字符串
    Git标签和别名管理
    Git分支管理
    Git远程仓库(github
    Git分布式版本管理工具基本使用方法
    CentOS7防火墙
    CentOS7新特性
    Linux系统初始流程
  • 原文地址:https://www.cnblogs.com/happyframework/p/3048648.html
Copyright © 2020-2023  润新知