1

如果我有以下代码(编辑:对不起,如果我不清楚,我想封装以下内容(忘记它的调用视图),以便我可以在其中做其他事情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它们正在返回特定的视图,因此除非我遗漏了什么,否则调用将不起作用。

4

3 回答 3

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);
}
于 2012-02-17T22:13:26.317 回答
0

您的示例不清楚,但是,我通常会将常用功能移动到单独的方法中并用 [NonAction] 属性标记它。例如

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

然后我会在您的操作方法中调用 GetUserInfo。

编辑:

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

我不能给你这个例子,因为我已经有一段时间没有这样做了,但你必须执行以下操作:

  1. 而不是 return View();你必须return PartialView("_NameOfYourPartialView", viewModel);
  2. 修改您的视图,使其不再是视图,而是局部视图。

你需要做一些阅读并自己尝试一下。

祝你好运

于 2012-02-17T23:43:00.240 回答
0

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

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

还有,为什么private void?您实际上想重用哪个部分?如果它需要一个Item并返回ItemsViewModel,它应该是private ItemsViewModel- 取决于您要重用的部分。void不返回任何东西。

于 2012-02-18T04:24:10.763 回答