【问题标题】:asp.net mvc - Rewrite Url after return viewasp.net mvc - 返回视图后重写 URL
【发布时间】:2015-07-20 09:59:03
【问题描述】:

我有这样的问题。在 RouteConfig.cs 中,我设置了路由

routes.MapRoute(
      "NewsDetails",
      "news/details-news/{title}-{id}",
      new { controller = "News", action = "Details", id = "", title = "" }
);

在我的 NewsController 的 Index.cshtml 中有一个链接

@Html.RouteLink(item.Title, "NewsDetails", new { 
         title = MyWeb.Classes.PrettyUrlHelper.PrettyUrl(item.Title), 
         id = item.Id 
})

在我的 NewsController 中:

public ActionResult Details(string title,String id)
{
    if (id == null && title == null)
       return RedirectToAction("Index");


     try
     {
        int ID = Int32.Parse(id);

        var result = NewsConnectionDB.GetInstance().Single<LifeStory>(ID);

        return View(result);
      }

      catch (InvalidOperationException) { 
          return  View("~/Views/Error/Error404.cshtml"); 
      }
      catch (FormatException) { 
          return View("~/Views/Error/Error404.cshtml"); }
 }

因此,如果用户单击 View 中的链接,该链接将路由到要处理的操作详细信息,并且该链接是 Seo Url Friendly (localhost:9224/news/details-news/ten-things-2)。但是用户键入链接而不是单击 View 中的链接:

  localhost:9224/news/details-news/ten-thingsblahblahblah-2

上面的 url 是正确的 id 但标题不是。那么,如果用户输入了错误的标题但正确的 id,我如何在返回 View 后更新 url?

任何帮助将不胜感激。

P/S:我的英文不好,希望你能理解。

【问题讨论】:

  • 在控制器中,用代码重写这个 URL HttpContext.Current.Response.AppendHeader("CorrectUrl", "YourUrl");

标签: asp.net-mvc url-rewriting


【解决方案1】:

如果标题不正确,那么您可以在响应标头中发送正确的 url。如果是 ajax 调用,则在完成时检查响应标头中的正确 url。如果存在正确的 url,则使用 window.history.pushState javascript 方法更改您的浏览器 url。

Details 动作方法中使用下面的代码来设置响应头。

HttpContext.Current.Response.AppendHeader("CorrectUrl", "YourUrl");

【讨论】:

  • 它不起作用,我尝试了 HttpContext.Response.Headers.Add("Content-Length", String.Format("/news/details-news/{0}-{1} ", result.Title, result.Id));但一切都没有发生。如果我尝试 return Redirect(String.Format("/news/details-news/{0}-{1}"", result.Title, result.Id)); 那将再次重新查询数据库,这不好怎么做,对吗?
【解决方案2】:

使用 HttpServerUtility.UrlEncode(string);

javascript 代码可以替换 url,我认为它会起作用 :)。

C#代码

string _entitle = HttpServerUtility.UrlEncode(_strTitle);
string _strCorUrl = "http://example.com/"+ _entitle + "-" + _intID.toString();

脚本代码

top.window.location.replace('CorrectUrl');

或C#代码重定向网址

Response.Redirect(url);

更新 Context.RewritePath

的可能 1 解决方案

https://msdn.microsoft.com/en-us/library/sa5wkk6d(v=vs.110).aspx

void Application_BeginRequest(Object sender, EventArgs e)
{
    string originalPath = HttpContext.Current.Request.Path.ToLower();
    if (originalPath.Contains("/page1"))
    {
        Context.RewritePath(originalPath.Replace("/page1", "/RewritePath.aspx?page=page1"));
    }
    if (originalPath.Contains("/page2"))
    {
        Context.RewritePath(originalPath.Replace("/page2", "/RewritePath.aspx"), "pathinfo", "page=page2");
    }
}  

它的代码是例子,你可以使用它 希望对你有帮助

【讨论】:

  • 感谢帮助,脚本代码不起作用,但 C# Redirect url 起作用。如果我使用重定向将再次重定向操作详细信息,因此我必须再次重新查询数据库,这是一种好方法吗?
  • 我尝试更新您的答案,但没有任何反应,所以我必须使用 Redirect 方法和一些静态变量来防止再次重新查询数据库。感谢您的所有帮助和支持。
  • =))。你试过了吗?并将 RewritePath 应用于您的应用程序?在控制器中,您可以重定向到另一个 URL 开始查询数据库:)。如果您检查当前 URL 错误,则开始查询数据库并返回查看。如果我的回答有帮助,你能投票吗?其他用户可以查看并获取我的答案。
  • 当然,我试过了,你为什么不做呢?如果我使用 RewritePath,路径会被修改,但是当返回视图时,我的 URL 不正确,所以我告诉你这没有任何事情发生。当我不查询数据库并返回视图时,如何检查当前 URL 是否正确?您的回答是正确且有帮助的,但对我的问题没有帮助。非常感谢。
  • 当然,你要查询数据库检查title是否为真,如果不查询数据库,如何检查title是否为真.我的回答可以帮助您更改 URL。 路径被修改,我的 URL 不正确 ** 为什么你告诉我什么都没发生?。你的问题已经解决了**如果用户输入了错误的标题但正确的 id,我如何在返回 View 后更新 url?
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2011-08-24
相关资源
最近更新 更多