在Controller中重用ActionResult代码

时间:2012-02-17 21:06:36

标签: asp.net-mvc-3 controller actionresult

如果我有以下代码(编辑:对不起,如果我不清楚,我想封装以下(忘记查看其调用),以便我可以在{{1 }})

ActionResult

如何在我的控制器中的不同操作中重复使用它而无需复制/粘贴。我尝试用代码做一个私有方法。但我坚持:

  1. 在操作方法中调用错误: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); } 然后在操作中调用private void Item (Item item) {//copied code from above};或

  2. 它与Item(item);有关,我做错了;或

  3. 完全不同的是我做得不对。

  4. 非常感谢任何例子。

    编辑:上面的代码适用于CheckBoxList。这是一个特定的CheckBoxList。但我希望能够在其他视图中使用它,而无需将代码复制/粘贴到其他(string[] items, PostedItems postedItems)。只是调用ActionResults将无效,因为我打算做其他事情。特别是,我在每个ActionResult中都有向导代码,例如:

    ActionResult

    正在返回特定视图,因此只有if ((nextButton != null) && ModelState.IsValid) return RedirectToAction("EMailConfirm"); return View("EMail/BasicDetails", myData); 的调用才会起作用,除非我遗漏了某些内容。

3 个答案:

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

答案 1 :(得分:0)

您的示例不清楚,但是,我通常会将常用功能移到单独的方法中并使用[NonAction]属性进行标记。 E.g。

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

然后我会在你的动作方法中调用GetUserInfo。

修改

您需要查看部分视图。您可以将局部视图视为可以在多个页面上重复使用的控件。例如,我可以在部分视图中放置登录控件并在多个页面上重新登录。这将促进代码的可重用性。

我不能给你一个例子,因为我暂时没有这样做,但你必须做以下事情:

  1. 而不是return View();,您必须return PartialView("_NameOfYourPartialView", viewModel);
  2. 修改您的视图,因此它不再是视图,而是部分视图。
  3. 你需要做一些阅读并亲自试试。

    祝你好运

答案 2 :(得分:0)

您可以从另一个返回ActionResult的操作中调用此操作。

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

另外,为什么private void?您真正想要重用哪一部分?如果需要Item并返回ItemsViewModel,则应为private ItemsViewModel - 取决于您要重复使用的部分。 void不返回任何内容。