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 文件中注册了路由。
欢迎任何改进和建议。
我的家庭控制器中有这样的登录操作方法
[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 文件中注册了路由。
欢迎任何改进和建议。