• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    基于.NET中:自动将请求参数绑定到ASPX、ASHX和MVC的方法(菜鸟必看)

    前言

    刚开始做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" targetFramework="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值的解决方法
    上一篇:水晶易表调用C#的WebService,返回数据集合的应用分析
    下一篇:关于DDD:管理工作单元实例的两种模式的使用方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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