2010-10-18 59 views
0

我有一个基于以下情形几个问题:跨控制器传递视图模型(含请求参数)

我有以下方法的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传递给PricingController?我需要在整个应用程序中访问(数据)“SearchView”ViewModel,因为用户可以根据初始搜索条件添加可选项目,并且可以根据需要修改此搜索条件。我应该将“SearchView”ViewModel存储在缓存中吗?我将在Web Farm中部署我的应用程序,并且不想使用Http Session。我将使用Cookies来管理用户会话。

回答

0

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

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

谢谢Joakim。我知道我可以这样做,但这是一种正确的方法吗?还是有更好的方法来做到这一点? – Alex 2010-10-18 18:05:44

+0

据我所知,如果你想基于另一个视图返回一个视图,那么这就是要走的路,然而我会直接在动作搜索中使用包含搜索方法的服务,并从那里呈现视图。 – Joakim 2010-10-18 18:27:57

+0

再次感谢。关于您的第二种方法,我可以在“搜索(SearchView搜索)”方法中调用定价服务并填充PricingView View模型,但是如何呈现View?如果我调用“返回视图(模型)”,那么它不会改变我的浏览器中的URL,并在浏览器上重新加载/刷新将是一个问题...如果我调用“RedirectToAction()”方法,那么我在我的视图模型。我希望我有道理? – Alex 2010-10-18 19:28:13

0

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

+0

谢谢Darin。它实际上是包含我在多个(70%)控制器中需要的搜索参数的“SearchView”ViewModel,以及我的核心组件,附加件,中间件等的定价结果将基于最初的搜索条件。你会建议将这些信息注入我的控制器吗?如果是这样,注入此信息的最佳方式是什么? – Alex 2010-10-18 20:59:21

+0

你可以编写一个自定义的控制器工厂和[注入依赖到你的控制器](http://weblogs.asp.net/shijuvarghese/archive/2009/03/12/applying-dependency-injection-in-asp-net-mvc -nerddinner-COM-application.aspx)。 – 2010-10-18 21:02:30

0

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

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

您可以修改您的观点后,直接出现:

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

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

0

亚历克斯,所有我会停止去想它作为视图模型的

第一。 ViewModel完全是关于视图,与视图本身密切相关。你在谈论的是数据(在整个应用程序中使用的一组标准)。所以这个问题可能不是关于传递ViewModel,而是关于传递数据和保存/共享状态(选定的标准)。

您可以拥有某种SearchCriteriaData DTO类,并在您的应用程序的任何需要的地方将其用于不同的ViewModels中。 SearchViewModel本身可能只有SearchCriteriaData的唯一参数。总监不应该为保持国家一致性而烦恼,它只是不负责任。它可以刷新它(使用一些服务调用,例如SearchService)并且忘记并且永远不会考虑谁将使用它。

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

因此,让你的控制器应该是无状态的,并用查询字符串参数或SearchService控制状态(从当前位置提取当前用户定义的搜索条件)。

相关问题