跨控制器传递ViewModel(包含请求参数)

时间:2010-10-18 17:21:28

标签: c# asp.net-mvc asp.net-mvc-2

基于以下情况,我几乎没有问题:

我有一个带有以下方法的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,它将使用包含我的搜索参数的“SearchView”ViewModel并调用业务服务来获取定价结果并将其呈现给用户。

这是正确的做法吗?如何从SearchController将包含我的搜索参数的“SearchView”ViewModel传递给PricingController?我需要在整个应用程序中对“SearchView”ViewModel进行访问(数据),因为用户可以根据初始搜索条件添加可选项,并且可以根据需要修改此搜索条件。我应该在Cache中存储“SearchView”ViewModel吗?我将在Web Farm中部署我的应用程序,并且不想使用Http Session。我将使用Cookie来管理用户会话。

4 个答案:

答案 0 :(得分:0)

将模型传递给另一个动作,你可以这样做:

[HttpPost]
public ActionResult Search(SearchView search)
{
    return RedirectToAction("Index", "Pricing", new { exactNameOfSearchViewParameter = search });
}

答案 1 :(得分:0)

您可以拥有一个处理价格计算的定价库。现在将此存储库注入每个需要计算价格并在操作中使用它的控制器。这样您就不需要任何重定向,在需要使用价格的每个操作中,只需在存储库中调用适当的方法。

答案 2 :(得分:0)

在这种情况下,我想我会将Search操作方法移到PricingController。它似乎真的属于那里,因为你正在进行与价格相关的搜索。

然后您不必担心如何在控制器之间传输数据。

您可以修改视图直接在那里发布:

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

如果您确实需要在控制器或操作之间传递数据,可以使用TempData。只需确保TempData为空时控制器/操作/视图仍然有效。

答案 3 :(得分:0)

亚历,

首先,我不再像ViewModel那样考虑它了。 ViewModel是关于View的所有内容,与View本身密切相关。你所说的是Data(在整个应用程序中使用的一套标准)。所以问题可能不是传递ViewModels而是关于传递数据和保存/共享状态(所选标准)。

您可以拥有某种SearchCriteriaData DTO类,并在您需要的任何地方的应用程序中的不同ViewModel中使用它。 SearchViewModel本身可能只有SearchCriteriaData的参数。控制器不应该为维持状态一致性而烦恼,这不是它的责任。它可以刷新它(使用一些服务调用,例如SearchService)并忘记并且从不考虑谁将使用它。

然后需要使用这样的搜索条件的Controller,不仅依赖于给定的查询字符串参数,还从SearchService(它提供实际的SearchCriteriaData)中提取这些条件,并将其附加到自己的特定ViewModel。有了它,您永远不会担心控制器级别的状态并将其控制在其他位置(如果需要,SearchService甚至可以将这些条件保存在数据库中)。

所以,让你的控制器应该是无状态的,并用querystring参数或SearchService控制状态(从任何地方提取当前用户定义的搜索条件)。