MVC Route静态值

时间:2014-10-13 15:20:24

标签: asp.net-mvc asp.net-mvc-4

我不确定使用mvc路由是否可行,我无法找到类似的例子。

我有大约5个控制器动作是相同的方法,所以我想将它们重构成一个动作。我想将一个枚举值传递给控制器​​,告诉它应该传递给较低层的路径。

示例:

public ActionResult ViewPage(int id, PageEnum page) {
    var model = MyService.GetModelForTemplate(id, page);
    return ("ViewPage", model);
}

然后用户可以通过/ PagesTypeOne / ViewPage /或/ PagesTypeTwo / ViewPage /访问它。两条路由都通向相同的端点。

Route table attempt:

routes.MapRoute(
            name: "typeOne",
            url: "PagesTypeOne/{action}/{id}",
            defaults: new { controller = "Pages", action = "ViewPage", id = UrlParameter.Optional, page = PageEnum.TypeOne, }
        );

routes.MapRoute(
            name: "typeTwo",
            url: "PagesTypeTwo/{action}/{id}",
            defaults: new { controller = "Pages", action = "ViewPage", id = UrlParameter.Optional, page = PageEnum.TypeTwo, }
        );

这显然不起作用。

有没有办法可以做到这样的事情?它会使我的代码更加简洁。

2 个答案:

答案 0 :(得分:3)

screen != page,所以如果匿名类型的属性与参数匹配,它将起作用:

public ActionResult ViewPage(int id, PageEnum screen) {
  var model = MyService.GetModelForTemplate(screen);
  return ("ViewPage", model);
}

更新:创建了一个空的应用程序,它可以完美地运行:

namespace MvcApplication6
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

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

            routes.MapRoute(
                "Test1",
                "PagesTypeOne/{action}/{id}", // URL with parameters
                new { controller = "Home", 
                      action = "Index", 
                      id = UrlParameter.Optional, 
                      page = PageEnum.PageOne } // Parameter defaults
            );

            routes.MapRoute(
                "Test2",
                "PagesTypeTwo/{action}/{id}", // URL with parameters
                new { controller = "Home", 
                      action = "Index", 
                      id = UrlParameter.Optional, 
                      page = PageEnum.PageOne } // Parameter defaults
            );

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", 
                      action = "Index", 
                      id = UrlParameter.Optional } // Parameter defaults
            );

        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

public enum PageEnum
{
    Undefined,
    PageOne,
    PageTwo
}

控制器:

namespace MvcApplication6.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult ViewPage(int id, PageEnum page)
        {
            var debug = 1;  // break point

            return new EmptyResult();
        }

    }
}

答案 1 :(得分:2)

您可以使用一个路线定义使其完全动态化:

   // the route must be defined as the first route
   routes.MapRoute(
        name: "typeTwo",
        url: "{page}/ViewPage/{id}",
        defaults: new { controller = "Pages", action = "ViewPage", id = UrlParameter.Optional },
        new { page= getPageTypes() }
    );

getPageTypes方法:

private static string getPageTypes()
{
     var pageTypes = Enum.GetNames(typeof(PageEnum));
     return string.Join("|", pageTypes );
}

PagesTypeOne / ViewPage / 4部分必须与枚举的名称匹配。