2012-02-17 63 views
1

如果我有以下代碼(編輯:對不起,如果我不清楚,我想封裝以下(忘記它的調用視圖),以便我可以做其他東西ActionResult重新使用控制器內的ActionResult代碼

public ActionResult ModelBased(string[] items, PostedItems postedItems) { 
     var model = new ItemsViewModel(); 
     var selectedItems = new List<Item>(); 
     var postedItemIDs = new string[0]; 
     if (postedItems == null) postedItems = new PostedItems(); 

     if (items!= null && items.Any()) { 
      postedCityIDs = items; 
      postedItems.ItemIDs = items; 
     } 

     if (postedItems.ItemIDs != null && postedItems.ItemIDs.Any()) { 
      postedItemIDs = postedIems.ItemIDs; 
      model.WasPosted = true; 
     } 

     if (postedItemIDs.Any()) 
      selectedItems = ItemRepository.GetAll() 
       .Where(x => postedItemIDs.Any(s => x.Id.ToString().Equals(s))).ToList(); 

     model.AvailableItems = ItemRepository.GetAll(); 
     model.SelectedItems = selectedItems; 
     model.PostedItems = postedItems; 

     return View(model); 
    } 

我怎麼可能會重用它在我的控制器不同的操作,而無需複製/粘貼。我試着用代碼做一個私有方法。但我被困在:

  1. 要麼叫錯了一個操作方法中:private void Item (Item item) {//copied code from above}然後調用在行動Item(item);;或

  2. 它與(string[] items, PostedItems postedItems)有關,我做錯了;或

  3. 一些完全不同的東西我做得不對。

任何示例將不勝感激。

編輯:上面的代碼與CheckBoxList一起使用。這是一個特定的CheckBoxList。但我希望能夠在其他視圖中使用它,而無需將代碼複製/粘貼到其他ActionResults。只是撥打ActionResult將無法​​正常工作,因爲我打算做其他事情。特別是,我必須在每個ActionResult嚮導,例如代碼:

if ((nextButton != null) && ModelState.IsValid) 
    return RedirectToAction("EMailConfirm"); 
return View("EMail/BasicDetails", myData); 

其返回的具體意見,所以打電話只是ActionResult都不行,除非我失去了一些東西。

回答

1

return View(model);試圖找到原始操作的視圖。

指定return View("ModelBased", model);總是呈現命名"ModelBased"


public void SomeAction(string[] items, PostedItems postedItems) 
{ 
    // Modify the data as your like 
    return ModelBased(string[] items, PostedItems postedItems); 
} 

public void SomeOtherAction(string[] items, PostedItems postedItems) 
{ 
    // Modify the data as your like 
    return ModelBased(string[] items, PostedItems postedItems); 
} 

private ActionResult ModelBased(string[] items, PostedItems postedItems) { 
    var model = new ItemsViewModel(); 
    var selectedItems = new List<Item>(); 
    var postedItemIDs = new string[0]; 
    if (postedItems == null) postedItems = new PostedItems(); 

    if (items!= null && items.Any()) { 
     postedCityIDs = items; 
     postedItems.ItemIDs = items; 
    } 

    if (postedItems.ItemIDs != null && postedItems.ItemIDs.Any()) { 
     postedItemIDs = postedIems.ItemIDs; 
     model.WasPosted = true; 
    } 

    if (postedItemIDs.Any()) 
     selectedItems = ItemRepository.GetAll() 
      .Where(x => postedItemIDs.Any(s => x.Id.ToString().Equals(s))).ToList(); 

    model.AvailableItems = ItemRepository.GetAll(); 
    model.SelectedItems = selectedItems; 
    model.PostedItems = postedItems; 

    return View(model); 
} 
+0

這就是原生的'ActionResult'。我正試圖找出一種方法在控制器中的其他操作中重用該代碼。基本上,重用該代碼是因爲我需要將其放在其他操作中。我寧願保持乾爽。 – REMESQ 2012-02-17 22:49:58

+0

這就是我要說的。將代碼放在私有方法中。但是您需要指定視圖名稱才能使其工作。 – jgauffin 2012-02-18 11:28:51

+0

對不起,如果我誤解了。我明白你在說什麼。我的問題是如果我添加嚮導的代碼並重定向或返回特定的視圖。看到我上面的編輯。 – REMESQ 2012-02-18 13:45:31

0

你舉的例子是不清楚的觀點,但是,我會正常運行常見的功能集成到一個單獨的方法,用[無爲]屬性標記它。例如。

[NonAction] 
protected UserInfo GetUserInfo(string username) 
{ 
    // Return relevant data 
} 

然後我會在您的操作方法中調用GetUserInfo。

編輯:

你需要考慮的部分意見。您可以將局部視圖看作是可以在多個頁面上重複使用的控件。例如,我可以在一個局部視圖中放置一個登錄控件,並將它在多個頁面上覆制。這將促進代碼的重用性。

我不能給你的例子,因爲我還沒有這樣做了一段時間,但你必須做到以下幾點:

  1. 相反的return View();你必須return PartialView("_NameOfYourPartialView", viewModel);
  2. 修改您的視圖,因此它不再是視圖,而是局部視圖。

你需要做一些閱讀併爲自己嘗試一下。

好運

+0

您正處於正確的軌道上。我想在上面的'ActionResult'中去掉通用的功能。我嘗試過'私人無效',但無法弄清楚如何在動作中調用它。 – REMESQ 2012-02-17 23:50:04

+0

嗨,你能用文字寫下你的行動方法應該做什麼。我不清楚ModelBased的含義。我通常將操作方法​​與用戶操作相關聯。 – 2012-02-17 23:52:57

+0

'ModelBased'只是返回具有CheckBoxList的'ModelBased.cshtml'視圖。我想在其他視圖中重用CheckBoxList(通過'ActionMethod'),但不想複製/粘貼每個視圖中的代碼,而是使用私有方法並調用它。 – REMESQ 2012-02-17 23:57:53

0

你可以調用從返回ActionResult另一個動作這個動作。

public ActionResult OtherAction() 
{ 
    return ModelBased(items, postedItems); 
} 

另外,爲什麼private void?你真的想重用哪部分?如果需要Item並返回ItemsViewModel,則應該是private ItemsViewModel - 取決於您想要重複使用的部分。 void不返回任何內容。

相關問題