我正在创建一个Web应用程序。有一个默认页面,其中包含一系列问题。当用户单击将重定向到用户的问题时,问题文件夹中的ViewQuestion。在default.aspx页面上,使用datalist控件显示问题标题。而且我正在生成带有问题ID的网址。这个代码如下。
protected void listQuestion_ItemDataBound(object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem)
{
LinkButton lnkTitle = (LinkButton)e.Item.FindControl("lnkQuestion");
// lnkTitle.Style.Add("text-decoration", "none");
PostEntity Item = (PostEntity)e.Item.DataItem;
lnkTitle.PostBackUrl = GenerateURL(Item.Title, Item.Id);
}
}
public static string GenerateURL(string title, int Id)
{
string strTitle = title.Trim();
strTitle = strTitle.ToLower();
//strTitle = strTitle.Replace();
strTitle = strTitle.Replace(" ", "-");
strTitle = strTitle.Trim();
strTitle = strTitle.Trim('-');
strTitle = "~/Questions/ViewQuestion.aspx?QuestionID=" + Id.ToString().Trim() + "/" + strTitle + ".aspx";
return strTitle;
}
在global.asax中代码是
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RegisterRoute(RouteTable.Routes);
}
static void RegisterRoute(RouteCollection route)
{
route.MapPageRoute("Default", "Default", "~/Default.aspx");
route.MapPageRoute("ViewQuestion", "Questions/ViewQuestion{QuestionID}", "~/Questions/ViewQuestion.aspx");
}
以及获取Querystring的viewpage如下:
lblQustionText.Text = this.Page.RouteData.Values["QuestionID"].ToString() as string; // giving me object reference exception
我的pageurl正在生成这样的
/Questions/ViewQuestion.aspx?QuestionID=1376/get-the-current-logged.aspx
我如何为SEO友好网址制作此示例。谢谢你的回答。
答案 0 :(得分:2)
您的代码有两件事似乎是错误的:
您的网页路由应该包含页面名称(ViewQuestion)和问题ID之间的正斜杠:
Questions/ViewQuestion/{QuestionID}
您生成的页面URL与路由不匹配,它不应包含aspx后缀,并且路由参数和查询参数的顺序混合在一起。它应该像
String.Format("~/Questions/ViewQuestion/{0}?QuestionID={1}", strTitle, Id.ToString().Trim())
作为旁注,我发现包含一个与路由参数具有完全相同名称的查询参数有点令人困惑。我的建议是为stackoverflow-style使用route参数:
/Questions/ViewQuestion/numerical-id/question-description