2016-10-14 54 views
0

在使用Razor的MVC C#Web應用程序中,我總是希望重複使用視圖代碼來創建動作。分享一個單一的剃刀創建視圖與一組具有可擴展性的屬性的模型

想象一下這樣的情景:

public class Taco 
{ 
    public Lunch Lunch { get; set; } 
    public Supper Supper { get; set; } 
    public string Cheese { get; set; } 
} 

public class Lunch 
{ 
    public IEnumerable<Taco> Taco { get; set; } 
} 

public class Supper 
{ 
    public IEnumerable<Taco> Taco { get; set; } 
} 

吃午飯和晚飯有玉米餅。

現在採取這兩個用例:

  • 從晚餐的詳細信息查看

    1. 想添加一個塔科

    2. 點擊 '創建新塔克'

    3. 輸入塔科信息

    4. 點擊 '創建' 按鈕

    5. 重定向到晚餐細節與新塔克有

  • 從午餐的詳細信息查看

    1. 想添加一個塔科

    2. 點擊「創建新塔科」

    3. 輸入塔克信息

    4. 點擊 '創建' 按鈕

    5. 重定向到新的塔可有

什麼是可擴展性和MVC-正確的方式來午餐詳情做這個?

我一直覺得我的流程因爲這樣被黑了,而且擴展性不好。我可能會做這樣的事情:

晚餐查看:

@Url.Action("Create", "Taco", new { From = "Supper" }) 

午餐查看:

@Url.Action("Create", "Taco", new { From = "Lunch" }) 

然後將 「從」 變量,並傳遞給

塔克控制器>塔克查看模型>塔科視圖>鏈接返回從

是否有內置的方式來傳遞引用信息是否有預定義的MVC設計模板來處理這些情況?

回答

1

從字面上重用所有東西。例如,您可以只使用一個視圖執行一個操作,並使用該URL來確定行爲。您所需要的只是一個視圖模型,因此表單可以只使用一種類型,然後您可以將數據映射到任何應該去的地方。例如:

[HttpPost] 
[ValidateAntiForgeryToken] 
[Route("{mealType:regex(supper|lunch)}/create")] 
public ActionResult CreateMeal(string mealType, MealViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     switch (mealType) 
     { 
      case "supper": 
       // map data to new `Supper` and save 
       break; 
      case "lunch": 
       // map data to new `Lunch` and save 
       break; 
     } 

     // do redirect 
    } 

    return View(model); 
} 

還有其他的方法來處理這個問題,而無需使用屬性路由,但總的想法是,以某種形式或方式您指示哪個餐類型被保存,和分支因此,創建和保存適當的班級。

1

據我所知,沒有預先定義的模板。但是你可以創建一個EditorTemplate,如果你想要一個並且在你的剃鬚刀視圖中被廣泛使用。此外,您可以在Supper和Lunch類中使用gobackUrl(只是示例)中的屬性,並在Create GET操作中生成gobackUrl,並將其隱藏在窗體中,而不是發送From中的From參數。因此,子操作視圖將更通用,並且您不需要在父視圖中具有if-else邏輯。

相關問題