2015-02-17 93 views
0

我目前正在MVC中的課程申請網站上工作。我對MVC相對來說比較陌生,我正試圖抓住RouteConfig文件來實現信息架構的目標並避免重複。MVC RouteConfig設置控制器和動作屬性作爲參數

我認爲這是一個機會,只是三個控制器/視圖處理邏輯的批量:

視圖1.地區/國家選擇畫面
視圖2.課程選擇畫面
視圖。課程細節和應用程序屏幕

信息架構應該工作如下: {地區}/{國家}/{}當然

  1. 用戶選擇課程將從哪個國家/州進行操作,課程國家可以存在三個地理區域之一:AMER,EMEA和APAC

  2. 用戶選擇其國家/州。
    〜/ AMER/USA /用手語
    〜/ EMEA/GBR/FirstAid
    〜/ APAC/AUS/EmploymentLaw

    每個爲,地區,國家/州和病程值被分貝驅動

  3. 用戶查看課程詳細信息,並申請課程上課。

縱觀默認圖路線和搜索高低,我努力尋找一種方法來引入動態控制和操作源(如參數操作),以確保我沒有建立三個控件處理地區和各種行動,以適應每個正在處理的國家。

由於該課程實際上是一個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

你靠近,那這樣的路線:

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); 
    } 
} 

這個工作對你給所有三個示例網址。然後,您可以將驗證邏輯傳遞到服務/存儲庫/任何要根據您選擇的數據存儲進行驗證的地方。然後,當添加地區/國家/課程時,您不需要更改代碼。

而且圓了我的例子,這裏是數據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>