2012-02-17 67 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不返回任何内容。

相关问题