通过Route.Config进行URL重写问题

时间:2014-07-14 11:13:44

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

我可以使用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" }
        );

在上面的代码中,我将Controller作为"离线"并采取一些行动。

我可以改变路线:

TO: www.abc.com/written

FROM www.abc.com/Offline

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

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

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

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

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

1 个答案:

答案 0 :(得分: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();
    }
}