基于以下情况,我几乎没有问题:
我有一个带有以下方法的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来管理用户会话。
答案 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控制状态(从任何地方提取当前用户定义的搜索条件)。