Повторное использование кода ActionResult в контроллере - PullRequest
1 голос
/ 18 февраля 2012

Если у меня есть следующий код (РЕДАКТИРОВАТЬ: Извините, если мне неясно, я хочу инкапсулировать следующее (забыть о представлении его вызова), чтобы я мог делать другие вещи в 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 не будет работать, если я что-то не пропустил.

Ответы [ 3 ]

1 голос
/ 18 февраля 2012

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 голосов
/ 18 февраля 2012

Вы можете вызвать это действие из другого действия, которое возвращает ActionResult.

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

Кроме того, почему private void? Какую часть вы на самом деле хотите использовать повторно? Если он принимает Item и возвращает ItemsViewModel, он должен быть private ItemsViewModel - зависит от части, которую вы хотите использовать повторно. void ничего не возвращает.

0 голосов
/ 18 февраля 2012

Ваш пример неясен, однако я обычно переносил бы общие функциональные возможности в отдельный метод и отмечал бы его атрибутом [NonAction]. Э.Г.

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

Я бы тогда вызвал GetUserInfo в вашем методе действия.

Edit:

Вам нужно посмотреть на частичные виды. Вы можете рассматривать частичное представление как элемент управления, который можно повторно использовать на нескольких страницах. Например, я могу поместить элемент управления входом в частичное представление и изменить его на нескольких страницах. Это будет способствовать повторному использованию кода.

Я не могу привести вам пример, так как некоторое время не делал этого, но вам придется сделать следующее:

  1. Вместо return View(); вам придется return PartialView("_NameOfYourPartialView", viewModel);
  2. Измените свой вид, чтобы он больше не был видом, а был частичным.

Вам нужно будет немного почитать и попробовать сами.

Удачи

...