MVC URL 重写

MVC URL re-writing

我的家庭控制器中有这样的登录操作方法

 [HttpGet]        
        public ActionResult Login()
        {
            return View();
        }

我将这个 Action 方法作为我的应用程序的起始页,但是我想像这样重写它 www.abc.com/MySite/security/login

这个属性我写在[HttpGet]之后

   [Route("MySite/security/Login")]

现在的问题是,当我 运行 应用程序时,它给我错误

The resource cannot be found.

这是我的 RoutConfig

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

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


        }

我该如何解决这个问题,而且我有与 HttpPost 属性相同的名称方法,我是否也必须在其上写 Rout 属性?

这应该可以完成工作:

[RoutePrefix("MySite/Security")]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [HttpGet]
        [HttpPost]
        [Route("Login")]
        public ActionResult Login()
        {
            return View("~/Views/Home/Index.cshtml");
        }
    }

已编辑:

有一种方法,但我不确定这是否是最好的方法。您需要像这样创建另一个名为 DefaultController 的控制器:

public class DefaultController : Controller
    {
        //
        // GET: /Default/
        public ActionResult Index()
        {
           return RedirectToAction("Login","Home");
        }
    }

在您的 RouteConfig.cs 中,将 'Default' 路线更改为:

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

这应该可以完成工作。我仍在努力寻找其他更好的方法。

首先,您应该在默认路由的顶部添加自定义路由,因为您有 2 个使用不同 HTTP 协议的操作方法,并且想要使用相同的操作名称创建自定义路由。

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

    // custom route
    routes.MapRoute(
           name: "Login",
           url: "MySite/{controller}/{action}/{id}",
           defaults: new { controller = "Security", action = "Login", id = UrlParameter.Optional }
    );

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

请注意,您使用 Login 方法的控制器应命名为 SecurityController,然后您可以像这样设置属性路由代码:

// set all default prefix to /Security path
[RoutePrefix("Security")]
public class SecurityController : Controller
{
    [Route("Login")]
    public ActionResult Login()
    {
        return View();
    }
}

此外,确保您已经在 Global.asax 文件中注册了路由。

欢迎任何改进和建议。