【问题标题】:URL rewriting issue through Route.Config通过 Route.Config 的 URL 重写问题
【发布时间】:2014-07-14 11:13:43
【问题描述】:

我可以使用Route.Config 文件对我的 MVC 应用程序进行 URL 重写,如下所示:

    //Offline Consult Route
    routes.MapRoute(
        name: "WrittenStep2",
        url: "written/step2/{id}",
        defaults: new { controller = "Offline", action = "Step2", id = UrlParameter.Optional }
        );

    routes.MapRoute(
        name: "Written",
        url: "written",
        defaults: new { controller = "Offline", action = "Index" }
        );

在上面的代码中,我将控制器设置为“离线”并进行了一些操作。

我可以改变路线:

收件人: www.abc.com/written

来自 www.abc.com/Offline

我的问题是我仍然可以访问 URL:www.abc.com/Offline。我该如何解决这个问题?

我已尝试使用Global.asax 文件的Begin_Request 方法拒绝用户访问此URL。

但是在这样做之后,我将无法访问我使用 jQuery Ajax 调用的方法。

$.ajax({
    type: "POST",
    url: "/Offline/HelloWorld",
    data: jsonString,
    contentType: "application/json",
    ...

有没有办法限制用户使用相同的 URL?

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-routing global-asax


【解决方案1】:

试试this,可能对你有帮助 ... 对于给定的示例,如果您想限制或导航特定 URL 的用户,您可以尝试:

1- 使用自定义路由处理程序包含离线路由

            routes.MapRoute(
              "OfflineWithoutParameterRoute",
              "Offline"
             ).RouteHandler = new NewUrlRouteHandler();

        routes.MapRoute(
            name: "WrittenStep2",
            url: "written/step2/{id}",
            defaults: new { controller = "Offline", action = "Step2", id = UrlParameter.Optional }
            );

        routes.MapRoute(
            name: "Written",
            url: "written",
            defaults: new { controller = "Offline", action = "Index" }
            );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

2- 创建你的 MvcRouteHandler 为

    public class NewUrlRouteHandler : System.Web.Mvc.MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
    {
        //restrict or navigate to any destination
        requestContext.RouteData.Values["controller"] = "Home";
        requestContext.RouteData.Values["action"] = "index";

        return base.GetHttpHandler(requestContext);
    }
}

你可以保持任何方法

因此 www.abc.com/Offline 的任何命中都将命中自定义处理程序,而 www.abc.com/Offline/prm 的任何路由都将遵循默认值路线。

我已尝试使用您给出的控制器/动作作为示例,它应该对您有所帮助。

    public class OfflineController : Controller
{
    // GET: Offline
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Step2(int id)
    {

        return View();
    }
    public ActionResult HelloWorld(int id)
    {

        return View();
    }
}

【讨论】:

  • 即使给定的链接解决了问题,如果链接消失了怎么办?你应该详细说明一下。
  • 现在应该详细了..希望对您有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多