【问题标题】:MVC RouteConfig Setting Controller and Action attributes as parametersMVC RouteConfig 设置 Controller 和 Action 属性为参数
【发布时间】:2015-04-18 19:27:19
【问题描述】:

我目前正在开发 MVC 中的课程申请网站。我对 MVC 比较陌生,我正在尝试掌握 RouteConfig 文件以实现信息架构的目标并避免重复。

我认为这是一个机会,只需三个控制器/视图来处理大部分逻辑:

查看 1. 地区/国家选择屏幕
查看 2. 课程选择屏幕
查看 3. 课程详情和申请屏幕

信息架构应按以下方式工作: {region}/{country}/{course}

  1. 用户选择课程所在的国家/地区,课程所在国家/地区可以位于以下三个地理区域之一:AMER、EMEA 和 APAC

  2. 用户选择其国家/州提供的课程。
    ~/AMER/USA/SignLanguage
    ~/EMEA/GBR/急救
    ~/APAC/AUS/EmploymentLaw

    地区、国家/州和课程的每个值都是数据库驱动的

  3. 用户查看课程详情,并申请该课程的课程。

看着Default MapRoute,高高在上,苦苦寻找引入动态控件和动作源(作为参数操作)的方法,确保不用构建三个控件来处理区域和多种行动,以适应正在处理的每个国家/地区。

由于课程实际上是一个 ID,我非常有信心这不是一个大问题。

我想我可以做这样的事情来处理控制器逻辑,但我认为即使在这种情况下我仍然需要生成几个控制器以及数百个动作。

routes.MapRoute(
name: "Courses",
url: "{controller}/{action}/{id}",
defaults: new {
    controller = "Region",
    action = "Index",
    id = UrlParameter.Optional
}
constraints: new {
    controller = @"^(AMER|EMEA|APAC).+/i"
});

解决此问题的最佳方法是什么?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 url-rewriting routes


    【解决方案1】:

    你很接近,为路线做这个怎么样:

      routes.MapRoute(
          name: "Default",
          url: "{region}/{country}/{course}",
          defaults: new { controller = "Course", action = "Detail" }
      );
    

    和控制器:

    public class CourseController : Controller
    {
      // GET: Course
      public ActionResult Detail(string region, string country, string course)
      {
        //TODO: Validation
        var data = new Data
        {
          Region = region,
          Country = country,
          Course = course
        };
    
        return View(data);
      }
    }
    

    这适用于您提供的所有三个示例 URL。然后,您可以将验证逻辑传递给服务/存储库/任何东西,以针对您选择的数据存储进行验证。那么在添加地区/国家/课程时,您无需更改代码。

    为了完善我的示例,这里是数据类:

    public class Data
    {
      public string Region { get; set; }
      public string Country { get; set; }
      public string Course { get; set; }
    }
    

    并查看:

    @model StackOverflowExamples.Mvc.Controllers.Data
    
    @{ ViewBag.Title = "Details"; }
    
    <h2>Details</h2>
    
    <div>
        <h4>Data</h4>
        <hr />
        <dl class="dl-horizontal">
            <dt>@Html.DisplayNameFor(model => model.Region)</dt>
            <dd>@Html.DisplayFor(model => model.Region)</dd>
    
            <dt>@Html.DisplayNameFor(model => model.Country)</dt>
            <dd>@Html.DisplayFor(model => model.Country)</dd>
    
            <dt>@Html.DisplayNameFor(model => model.Course)</dt>
            <dd>@Html.DisplayFor(model => model.Course)</dd>
    
        </dl>
    </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      相关资源
      最近更新 更多