基于.NET中:自动将请求参数绑定到ASPX、ASHX和MVC的方法(菜鸟必看)

Vida ·
更新时间:2024-09-21
· 932 次阅读

前言

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

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

自动绑定到ASPX和ASHX

框架支持
代码如下:
using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 namespace Happy.Web
 {
     public interface IWantAutoBindProperty
     {
     }
 }

代码如下:
using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 namespace Happy.Web
 {
     [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
     public sealed class AutoBind : Attribute
     {
     }
 }

代码如下:
using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Web;
 using Newtonsoft.Json;
 using Happy.ExtensionMethods.Reflection;
 namespace Happy.Web
 {
     public class JsonBinderModule : IHttpModule
     {
         public void Init(HttpApplication context)
         {
             context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
         }
         private void OnPreRequestHandlerExecute(object sender, EventArgs e)
         {
             if (!(HttpContext.Current.CurrentHandler is IWantAutoBindProperty))
             {
                 return;
             }
             var properties = HttpContext.Current.CurrentHandler.GetType().GetProperties();
             foreach (var property in properties)
             {
                 if (!property.IsDefined(typeof(AutoBind), true))
                 {
                     continue;
                 }
                 string json = HttpContext.Current.Request[property.Name];
                 var value = JsonConvert.DeserializeObject(json, property.PropertyType);
                 property.SetValue(HttpContext.Current.Handler, value);
             }
         }
         public void Dispose()
         {
         }
     }
 }

代码示例
代码如下:
<?xml version="1.0" encoding="utf-8"?>
 <configuration>
     <system.web>
       <compilation debug="false" ta rgetFramework="4.0" />
       <httpModules>
         <add name="JsonBinderModule" type="Happy.Web.JsonBinderModule"/>
       </httpModules>
     </system.web>
 </configuration>

代码如下:
/// <reference path="../ext-all-debug-w-comments.js" />
 var data = {
     Name: '段光伟',
     Age: 28
 };
 Ext.Ajax.request({
     url: '../handlers/JsonBinderTest.ashx',
     method: 'POST',
     params: { user: Ext.encode(data) }
 });

代码如下:
<%@ WebHandler Language="C#" Class="JsonBinderTest" %>
 using System;
 using System.Web;
 using Happy.Web;
 public class JsonBinderTest : IHttpHandler, IWantAutoBindProperty
 {
     [AutoBind]
     public User user { get; set; }
     public void ProcessRequest(HttpContext context)
     {
         context.Response.ContentType = "text/plain";
         context.Response.Write(string.Format("姓名:{0},年龄:{1}", user.Name, user.Age));
     }
     public bool IsReusable
     {
         get
         {
             return false;
         }
     }
 }
 public class User
 {
     public string Name { get; set; }
     public int Age { get; set; }
 }

运行结果

自动绑定到MVC
框架支持
代码如下:
using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Web.Mvc;
 using Newtonsoft.Json;
 namespace Tenoner.Web.Mvc
 {
     public class JsonBinder : IModelBinder
     {
         public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
         {
             string json = controllerContext.HttpContext.Request[bindingContext.ModelName];
             return JsonConvert.DeserializeObject(json, bindingContext.ModelType);
         }
     }
 }

您可能感兴趣的文章:ashx中使用session的方法(获取session值)ASP.NET ASHX中获得Session的方法Asp.net在ashx文件中处理Session问题解决方法在ashx文件中使用session的解决思路ashx介绍以及ashx文件与aspx文件之间的区别ashx文件的使用小结aspx与ascx,ashx的用法总结后缀为 ashx 与 axd 的文件区别浅析*.ashx文件不能访问Session值的解决方法



自动 net aspx .NET 方法 参数 MVC 菜鸟

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章