MVC RouteConfig将Controller和Action属性设置为参数

时间:2015-02-17 22:52:26

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

我目前正在MVC的课程申请网站上工作。我对MVC相对较新,我试图掌握RouteConfig文件以实现信息架构的目标并避免重复。

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

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

信息架构应如下工作: {区域} / {国家} / {当然}

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

  2. 用户选择其所在国家/地区的课程 〜/ AMER / USA /用手语
    〜/ EMEA / GBR / FirstAid
    〜/ APAC / AUS / EmploymentLaw

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

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

  4. 查看默认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"
    });
    

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

1 个答案:

答案 0 :(得分: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);
  }
}

这适用于您提供的所有三个示例网址。然后,您可以将验证逻辑传递给service / repository /以针对您选择的数据存储区进行验证。然后,在添加地区/国家/课程时,您不需要进行代码更改。

为了完善我的例子,这里是Data clasee:

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>