Передача ViewModel (содержащая параметры запроса) через контроллеры - PullRequest
0 голосов
/ 18 октября 2010

У меня есть несколько вопросов, основанных на следующем сценарии:

У меня есть LoginController со следующими методами:

public ActionResult Login()
{
    return View();
}

[HttpPost]
public ActionResult Login(UserObject user)
{

    Calling Besiness Service to Validate User againts DB (Using Repository)...  

    if (success)
    {
        return RedirectToAction("Search", "Search");
    }
    else
    {
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
    }
    return View(user);
}

После успешного входа в систему, я должен представить экран поиска. У меня есть SearchController со следующими методами:

public ActionResult Search()
{
    return View(); // This returns a EMPTY Search Form.

}

[HttpPost]
public ActionResult Search(SearchView search)
{
    // Validate Search parameters...
    // I have to perform a search by calling Business Service and present results. I would like to use a seperate controller (PricingController) for this task.
    return RedirectToAction("Index", "Pricing"); // Not sure if this is the correct way?
}

Теперь я хотел бы иметь PricingController, который будет использовать ViewModel «SearchView», содержащую мои параметры поиска, и вызвать бизнес-службу, чтобы получить результаты оценки и представить их пользователю.

Это правильный подход? Как передать ViewModel «SearchView», содержащую мои параметры поиска, в PricingController из SearchController? Мне нужен доступ (данные) к "ViewView" ViewModel во всем приложении, потому что пользователь может добавлять дополнительные элементы на основе начальных критериев поиска и может изменять эти критерии поиска, если это необходимо. Должен ли я хранить ViewModel "SearchView" в кэше? Я буду развертывать свое приложение в веб-ферме и не хочу использовать сеанс Http. Я буду использовать файлы cookie для управления сессиями пользователей.

Ответы [ 4 ]

0 голосов
/ 17 декабря 2010

Алекс,

Прежде всего, я перестал бы думать об этом с ViewModel.ViewModel полностью посвящен представлению и тесно связан с самим представлением.То, о чем вы говорите, - это Data (набор критериев, используемых в приложении).Таким образом, вопрос, скорее всего, заключается не в передаче ViewModels, а в передаче данных и сохранении / совместном использовании состояния (по выбранным критериям).

Вы можете иметь некоторый DTO-класс SearchCriteriaData и использовать его в различных ViewModels в вашем приложении, где бы вы ни находилисьэто необходимо.Сам SearchViewModel может иметь единственный параметр SearchCriteriaData.Контролер никогда не должен заботиться о поддержании согласованности состояния, это просто не его ответственность.Он может просто обновить его (используя некоторые сервисные вызовы, например, SearchService) и забыть и никогда не думать о том, кто будет его использовать.

Тогда контроллер, которому нужны такие критерии поиска, а не просто полагается на данныепараметры строки запроса, но также извлекает эти критерии из SearchService (который дает нам фактическую SearchCriteriaData) и добавляет его к своему определенному ViewModel.При этом вы никогда не сможете беспокоиться о состоянии на уровне контроллера и контролировать его где-то еще (что SearchService может даже сохранить эти критерии в базе данных, если это необходимо).

Итак, пусть ваши контроллеры будут оставаться без состояния, как это должно быть, и контролироватьсостояние либо с параметрами строки запроса, либо с помощью SearchService (который извлекает критерии поиска, определенные текущим пользователем, из любого места).

0 голосов
/ 18 октября 2010

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

0 голосов
/ 21 октября 2010

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

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

Вы можете изменить свой вид для публикации прямо там:

<% Html.BeginForm("search", "pricing"); %>
...
<% Html.EndForm() %>

Если вам действительно нужно передать данные между контроллерами или действиями, вы можете использовать TempData. Просто убедитесь, что ваш контроллер / действие / представление все еще работает, когда TempData пусто.

0 голосов
/ 18 октября 2010

Чтобы передать модель другому действию, вы можете сделать это:

[HttpPost]
public ActionResult Search(SearchView search)
{
    return RedirectToAction("Index", "Pricing", new { exactNameOfSearchViewParameter = search });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...