MVC URL重写

时间:2016-07-29 06:27:39

标签: c# asp.net-mvc asp.net-mvc-routing

我的家庭控制器中有登录操作方法,如此

 [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属性?

2 个答案:

答案 0 :(得分:0)

这应该做的工作:

[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中,更改'默认'路线:

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

这应该可以胜任。我还在努力寻找其他更好的方法。

答案 1 :(得分:0)

首先,您应该在默认路由的顶部添加自定义路由,因为您有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文件中注册该路线。

任何改进&建议欢迎。