项目类型 mvc3
流程:
1.路由设置
网站所有的路径都经过 global.asax 文件,想做好url优化,路由设置是关键,
打开global.asax.cs,可以看到 默认的Route name为 default 的路由设置,在此路由上写我们的路由设置,
msdn可以找到详细的关于 routes.MapRoute(),方法的多种重载说明
比如:
"关于我们" 使用拼音请求路径 如 关于我们:
http://www.yunjiw.com/about/GuanYuWoMen
这是云集中" 关于我们"的路由设置
routes.MapRoute(
"about", // Route name
"about/{txt}", // URL 参数设置, 前缀是about
new { controller = "Aboutyunji", action = "AboutlIndex", txt = UrlParameter.Optional },//控制器和方法我们可以不写在url里,只要有符合条件的路//由就可以
new[] { "eBuul.CESNS.WebSite.Controllers" }
);
这个路由,负责网站所有url前缀是 about/* 的路径 提交到Aboutyunji控制器的AboutlIndex方法中
2.解析url
AboutlIndex 方法中如下:
public ActionResult AboutlIndex(string txt)
{
//关于我们的子项ID
int id = 0;
//不为空
if (!string.IsNullOrEmpty(txt))
{
//解析传递过来的参数,并且找到ID
SpellName name = SpellExpand.Instatce().GetAboutBySpell(txt, out id);
}
//所有关于我们的子项
List<CMS> cms = ap.GetCMS();
//如果没有参数,赋ID为默认值
id = id == 0 ? cms.First().ID : id;
ViewBag.id = id;
ViewBag.cms = cms.Where(a => a.ID == id).First();
return View(cms);
}
在上面的方法中,关键是解析参数 ,解析参数的方法GetAboutBySpell 如下:
/// <summary>
/// 处理关于我们
/// </summary>
/// <param name="spell">拼音参数</param>
/// <param name="ID">拼音参数ID</param>
/// <returns></returns>
public SpellName GetAboutBySpell(string spell, out int ID)
{
if (ExistsSpell(aboutSpellXml, spell, out ID))
{
return SpellName.AboutSpell;
}
return SpellName.NoSpell;
}
//SpellName 是自定义的enum类,用来标示参数的类型,因为有很多需要优化的,existsSpell()方法如下:
/// <summary>
/// 是否存在
/// </summary>
/// <param name="xml">查找的数据源</param>
/// <param name="spell">拼音</param>
/// <param name="id">拼音参数的ID</param>
/// <returns></returns>
public bool ExistsSpell(XElement xml,string spell, out int id)
{
//讲所有"关于我们"的子项,使用xml保存到静态类中,也可以使用字典类型,xml没有保存到文件,值保存到静态类中了
XElement xel = xml.Elements(EntityTreeNodeName).Where(a => a.Value.ToLower() == spell.ToLower()).FirstOrDefault();
if (xel == null)
{
id = 0;
return false;
}
id = (int)xel.Attribute(TreeNodeAttributeName);
return true;
}
//xml集合 aboutSpellXml 写成类中的静态属性
aboutSpellXml = new XElement("Root", from a in db.CMS.AsEnumerable() orderby a.ID select new XElement(EntityTreeNodeName, a.CMSTitle.Convert(), new XAttribute(TreeNodeAttributeName, a.ID)));
//查询条件的集合之所以写成静态,因为查询条件是不变的,变动的只是组合方式
3.生成url
//生成查询条件的集合,在网站中,只生成一次,可以放到 路由设置里面,
//处理完请求后,页面返回响应, 在.cshtml页面上
<!--新版 关于我们 -->
@model List<eBuul.CESNS.Model.CMS>
@foreach (eBuul.CESNS.Model.CMS item in Model)
{
<a href="@Url.Content(string.Format("~/about/{0}", item.CMSTitle.Convert()))">@item.CMSTitle</a>
}
//item.CMSTitle.Convert() CMSTitle关于我们的子类的名称,使用Convert()自定义的扩展方法转成拼音参数
这样我们就完成了简单的url优化