【问题标题】:MVC5 route prefix setup, how to?MVC5 路由前缀设置,如何设置?
【发布时间】:2015-01-10 01:21:48
【问题描述】:

我想要做的:是在动作名称后添加前缀,这样浏览器的url栏就可以看到了。

http://stackoverflow.com/ask
                 ↓↓↓↓
http://stackoverflow.com/ask.mon

并且还想调用带有前缀的特定控制器。

http://stackoverflow.com/loginProcess.mon

如果像上面那样调用,那么可以调用下面的动作。


已更新:(记住,我不想在 url 栏上显示控制器的名称。)


public Class LoginController : Controller
{
     public ActionResult loginProcess() {
          return View();
     }
}
.
.

我做了什么:像下面这样设置路由配置。

   public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

控制器看起来像......

 public class LoginController : Controller
    {        
        public ActionResult Index()
        {
            if (Session["userInfo"] != null)
            {
                return RedirectToAction("Main", "Web");
            }
            else
            {
                return View();
            }
        }
    .
    .
    .

发生了什么:引发 404 错误。

我应该怎么做才能避免这种情况?

【问题讨论】:

    标签: c# asp.net-mvc routes asp.net-mvc-5


    【解决方案1】:

    要使您请求的 url (http://stackoverflow.com/login/loginProcess.mon) 正常工作,您的映射不包括控制器。下面的代码应该修复路由。

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}.mon/{id}", // Added {controller} to routing so Login/loginProcess.mon will work
        defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
    );
    

    那么LoginController 中的操作代码应该可以正常工作。

    public ActionResult loginProcess() {
        return View();
    }
    

    【讨论】:

    • 对不起先生,我更新了我的问题。我不希望控制器的名称出现在 URL 栏上。
    • 然后我对问题中同名的两个控制器感到困惑,一个是动作index,第二个是动作loginProcess。如果您更喜欢 Index 操作来完成这项工作,请将 {action} 替换为硬编码的 loginProcess.mon/{id},然后将默认操作保留为 index。
    【解决方案2】:

    最后,我找到了解决方案,你所要做的就是添加一个路由模块。

    此模块获取您的路由以定位预期的操作。

    <modules>
       <remove name="UrlRoutingModule-4.0" />
       <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
    </modules>
    

    这是解决此问题的另一种选择,尽管它不是解决此问题的直接方法,而且这可能是一种过饱和的方法。但间接地,当动作名称后面有前缀时,它可以解决这个 404 错误。只需将其放在您的Web.config&lt;system.webServer&gt; 部分

    <modules runAllManagedModulesForAllRequests="true" />
    

    这也有同样的效果,因为它也包含了上面的模块。

    我收集了一些相关信息,可能有助于您了解该功能。

    好吧,显然,runAllManagedModulesForallRequests 是不推荐的。

    【讨论】:

      猜你喜欢
      • 2020-05-17
      • 2014-08-28
      • 2019-11-13
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 2020-10-07
      • 2011-11-14
      • 1970-01-01
      相关资源
      最近更新 更多