源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-12-30 00:38 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:基于.NET中:自动将请求参数绑定到ASPX、ASHX和MVC的方法(菜鸟必看)
[b]前言[/b] 刚开始做AJAX应用的时候,经常要手工解析客户端传递的参数,这个过程极其无聊,而且代码中充斥着:Request["xxx"]之类的代码。 这篇文章的目的就是告诉初学者如何自动将客户端用AJAX发送的参数自动绑定为强类型的成员属性或方法参数。 [b]自动绑定到ASPX和ASHX[/b] [b]框架支持 [/b]
[u]复制代码[/u] 代码如下:
using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using System.Threading.Tasks;  namespace Happy.Web  {      public interface IWantAutoBindProperty      {      }  }
[u]复制代码[/u] 代码如下:
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      {      }  }
[u]复制代码[/u] 代码如下:
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()          {          }      }  }
代码示例
[u]复制代码[/u] 代码如下:
<?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>
[u]复制代码[/u] 代码如下:
/// <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) }  });
[u]复制代码[/u] 代码如下:
<%@ 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; }  }
[b]运行结果 [/b] [img]http://files.jb51.net/file_images/article/201304/2013042811284822.jpg[/img] 自动绑定到MVC [b]框架支持 [/b]
[u]复制代码[/u] 代码如下:
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);          }      }  }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部