時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)
由于MVC框架發(fā)展不久,還有很多不足的地方。其中關(guān)于路由規(guī)則配置這一塊問題比較大。首先路由規(guī)則是在全局配置問價 Global.asax 的 Application_Start()事件中注冊的。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute( "User",
// Route name
"{controller}/{action}/{id}",
// URL with parameters new { controller = "User", action = "Show", id = "0" }
// Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
默認(rèn)硬編碼的方式使得以后可維護(hù)程度大大降低。MVC 1.0 似乎沒有提供很好的基于配置文件的路由規(guī)則設(shè)置。所以只好自己實(shí)現(xiàn)了。直到寫這篇文章時,才找到了一個比較好的解決方案。
以下是 自定義的XML 格式
<?xml version="1.0" encoding="utf-8" ?> <MapRoutes> <!--默認(rèn)規(guī)則-->
<MapRoute name="Default" url="{controller}/{action}"> <Params>
<Item key="controller" default="Article"/>
<Item key="action" default="Index"/>
</Params>
</MapRoute>
<!--顯示新聞列表的路由規(guī)則-->
<MapRoute name="ShowArticleList" url="{controller}/{action}/{typeId}/{pageIndex}/{pageSize}">
<Params>
<Item key="controller" default="Article"/>
<Item key="action" default="Index"/>
<Item key="typeId" default="1"/>
<Item key="pageIndex" default="1"/>
<Item key="pageSize" default="10"/>
</Params>
</MapRoute>
</MapRoutes> 以下是全部代碼
***********************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;
using System.Xml.Linq;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
namespace Tension.Mvc
{
public static class RouteHelper
{
/// <summary>
/// 從XML文件中注冊路由規(guī)則
/// </summary>
/// <param name="routes"></param>
/// <param name="cfgFile"></param>
public static void Register(this RouteCollection routes, string cfgFile)
{
IList<Route> Routes = GetRoutes(cfgFile);
foreach (var item in Routes)
{
//路由規(guī)則對象
object obj = CreateObjectFormString(item.ToString(), item.Name);
routes.MapRoute(
item.Name,
// Route name
item.Url,
// URL with parameters
obj
// Parameter defaults
);
}
}
/// <summary>
/// 從XML文件中注冊路由規(guī)則 默認(rèn)文件為網(wǎng)站根目錄下MapRoute.config
/// </summary> /// <param name="routes"></param>
public static void Register(this RouteCollection routes)
{
Register(routes, string.Format("{0}\\MapRoute.config", Tension.ServerInfo.GetRootPath()));
}
/// <summary>
/// 從string動態(tài)創(chuàng)建類對象
/// </summary>
/// <param name="codeString"></param>
/// <param name="className"></param>
/// <returns></returns>
private static object CreateObjectFormString(string codeString, string className)
{
CSharpCodeProvider ccp = new CSharpCodeProvider();
Compilerparameters param = new CompilerParameters(new string[] { "System.dll" });
CompilerResults cr = ccp.CompileAssemblyFromSource(param, codeString);
Type type = cr.CompiledAssembly.GetType(className);
return type.Getconstructor(System.Type.EmptyTypes).Invoke(null);
}
#p#副標(biāo)題#e#
/// <summary> /// 從XML文件中解析路由規(guī)則 /// </summary>
/// <param name="configFile"></param> /// <returns></returns>
private static IList<Route> GetRoutes(string configFile)
{
StringBuilder sb = new StringBuilder();
Console.WriteLine(sb.ToString());
IList<Route> Routes = new List<Route>();
XElement xe = XElement.Load(configFile);
#region MyRegion foreach (var item in xe.Elements("MapRoute"))
{
名稱屬性 XAttribute xaName = item.Attribute("name");
if (xaName == null || string.IsNullOrEmpty(xaName.Value))
{
throw new ArgumentNullException("name!說明:路由配置文件中某規(guī)則缺少name屬性或name屬性的值為空字符串");
}
//URL屬性 XAttribute urlName = item.Attribute("url");
if (urlName == null || string.IsNullOrEmpty(urlName.Value))
{
throw new ArgumentNullException("url!說明:路由配置文件中某規(guī)則缺少url屬性或url屬性的值為空字符串");
}
Dictionary<string, string> DictParams = new Dictionary<string, string>();
#region MyRegion
foreach (var pItem in item.Element("Params").Elements("Item"))
{
XAttribute itemKey = pItem.Attribute("key");
if (itemKey == null || string.IsNullOrEmpty(itemKey.Value))
{
throw new ArgumentNullException("Item->key!說明:路由配置文件中某規(guī)則缺少Item->key屬性或Item->key屬性的值為空字符串");
}
XAttribute itemDefault = pItem.Attribute("default");
if (itemDefault == null || string.IsNullOrEmpty(itemDefault.Value))
{
throw new ArgumentNullException("Item->default!說明:路由配置文件中某規(guī)則缺少Item->default屬性或Item->default屬性的值為空字符串");
}
DictParams.Add(itemKey.Value, itemDefault.Value);
}
#endregion Routes.Add(new Route()
{
Name = xaName.Value, Url = urlName.Value, Params = DictParams });
}
#endregion return Routes;
}
}
/// <summary> /// 路由規(guī)則 /// </summary>
public class Route {
public string Name { get; set; }
public string Url { get; set; }
public Dictionary<string, string> Params { get; set; }
/// <summary> /// 重寫ToString 方法 產(chǎn)生需要動態(tài)代碼段
/// </summary> /// <returns></returns> public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.
關(guān)鍵詞標(biāo)簽:ASP.NET,MVC,路由規(guī)則
相關(guān)閱讀
熱門文章 手把手教你用好LINQ to SQL在.NET環(huán)境下為網(wǎng)站增加IP過濾功能ASP.NET 如何避免頁面重新整理時重復(fù)送出用Asp.net擴(kuò)展ExtJS
人氣排行 asp.net表單提交方法GET\POST在ASP.NET中如何判斷用戶IE瀏覽器的版本Asp.net中messagebox的實(shí)現(xiàn)方法Asp.net中的web.config配置在ASP.NET MVC中實(shí)現(xiàn)大文件異步上傳用Iformattable接口控制.Net中文本格式c#.Net經(jīng)典面試題目用Asp.net擴(kuò)展ExtJS