ASP MVC 1文件夹和子文件夹的自定义路由

时间:2016-08-08 21:00:05

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

我正在使用ASP MVC 1开发一个简单的CRUD应用程序,该应用程序将跨多个表存储数据以用于多个学生程序。在这样做的过程中,我试图弄清楚如何构建URL以适应每个程序,它们的表和它们的行为。

例如,我想要实现的目标是:

site.com/StudProg1/Participant/Create 将是为学生计划1插入参与者表格的条目

site.com/StudProg2/Course / 将成为学生计划2课程表的索引页面的网址

在我尝试创建自定义路由以适应这种情况时,我的Global.asax.cs文件如下:

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "StudProg1",
            "StudProg1/{pageName}/{action}",
            new { controller = "StudProg1", pageName="Index", action = "Index" }
        );

        routes.MapRoute(
            "StudProg2",
            "StudProg2/{pageName}/{action}",
            new { controller = "StudProg2", pageName="Index", action = "Index" }
        );

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

其中pageName应该是表名。

毫不奇怪,上面的结构不会返回我的目标输出(即它总是指向StudProg的索引页面)。

此外,我的文件目录结构如下:

Views
    StudProg1
        Index
        Participant
            Index
            Create
    StudProg2
        Index
        Courses
            Index
            Create

等。

我的问题是,如何改进我的路线以正确实现我想要的URL结构。此外,除了Microsoft ASP.NET开发人员网站之外,是否有关于自定义路由的好教程?

1 个答案:

答案 0 :(得分:0)

您不应该为每个学生计划(StudProg1,StudProg2等)创建控制器。您可以接受它作为参数。

您只需要2个控制器,一个用于Particiant,一个用于课程。

public class ParticipantController : Controller
{
    public ActionResult Index()
    {
        return Content("Reques for partiicpant index page if needed");
    }
    public ActionResult create(string studentProgram)
    {
        return Content("Partiicpant create for "+studentProgram);
    }
}
public class CourseController : Controller
{
    public ActionResult Index()
    {
        return Content("Course:");
    }
}

并在RouteConfig的RegisterRoutes方法中,指定通用默认路由之前的2条特定路由。

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

    routes.MapRoute("part","{studentProgram}/Participant/{action}",
        new { controller = "Participant", action = "Index" }
    );

   routes.MapRoute("course", "{studentProgram}/Course/{action}",
                       new { controller = "Course", action = "Index" }
   );

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

}