MVC 3 Action на другом контроллере, но нужен ViewModel - PullRequest
1 голос
/ 02 мая 2011

Я ищу наилучший способ решить следующую проблему: у меня есть страница поиска с различными критериями, которые можно выбрать, которые доступны в SearchViewModel.Теперь поиск возвращает список SearchResults, которые являются продуктами.Они могут быть добавлены непосредственно в корзину.Теперь проблема в том, что действие по добавлению элемента в корзину выполняется в BasketController, а не в SearchController.Когда пользователь щелкает его, он возвращается в SearchPage, но теряет все выбранные им варианты.

if (Request.UrlReferrer != null)
        return Redirect(Request.UrlReferrer.ToString());

Я попытался обойти проблему с помощью TempData, но я получил «Результат запроса».не может быть перечислен более одного раза. "- Исключение.

private SearchViewModel EnsureViewModel(SearchViewModel viewModel)
    {
        if (TempData["SearchModel"] != null && viewModel.SearchResult == null)
            viewModel = TempData["SearchModel"] as SearchViewModel;

        TempData["SearchModel"] = viewModel;
        return viewModel;
    }

Здесь, где я отображаю список моих результатов в модели, выдается исключение:

@Html.DisplayFor(p => Model.SearchResult)

Также считается, что может быть способ сделать это, используя частичное представление?Конечно, мой последний ресурс просто дублирует код, но я не в восторге от этой идеи ...

Любые идеи приветствуются, спасибо =)


Редактировать вызовДля контроллера производится использование формы следующим образом:

@using (Html.BeginForm("Add", "Basket", new { id = Model.Name } ))
    {
        @Html.TextBox("amount", "1", new { name="amount", maxlength=7, @class = "txtfield number" })
        <button><img src="@Url.Content("~/Content/images/icon_basket.gif")" border="0" width="14" height="10" class="basket" /></button>
    }       

Ответы [ 3 ]

1 голос
/ 02 мая 2011

Я думаю, что Redirect - это то, что взрывает TempData, попробуйте заменить «Redirect» в коде вашего контроллера на «View» и передать ему имя представления (не весь URL).

(Примечание: если действие вашего контроллера делало что-либо для заполнения модели представления, вам нужно скопировать этот код и вставить его непосредственно перед вызовом представления (я вынимаю его в закрытый метод и вызываю его из обоих места))

1 голос
/ 02 мая 2011

Почему бы не вызвать метод "Добавить в корзину" с помощью AJAX? Тогда пользователям не нужно покидать страницу поиска, чтобы добавлять товары в корзину, что сохранит их поиск.

Кроме того, когда я внедряю параметры поиска, я часто передаю эти параметры в строку запроса. Они по-прежнему заполняют SearchViewModel, но наличие их в строке запроса позволяет довольно легко при необходимости передавать их между веб-запросами.

0 голосов
/ 02 мая 2011

Если вы не можете использовать AJAX, есть еще один вариант:

  1. Храните все предметы корзины в сессии (очевидно).
  2. При рендеринге страницы результатов поиска, для каждого элемента убедитесь, что он уже есть в корзине. Если это так, покажите его отмеченным.
  3. Когда пользователь нажимает «Добавить в корзину», очищает корзину и снова заполняет ее, используя этот последний пост.

Конечно, я не уверен, что вы используете нумерацию страниц. Если да, то это решение, вероятно, не будет работать ...

...