我想要实现的目标:
每个视图执行完毕后,我想对外部合作伙伴进行单独的http调用。
我需要传递一个视图的内容作为该http调用的主体。
到目前为止我所拥有的:
我有一个基本控制器,我的所有控制器都从中继承。
我发现我可以覆盖基本控制器的onActionExecuted()方法并在那里编写我的伙伴http调用代码,以便在每次操作后执行它。
我在Send asp.net mvc action result inside email阅读文章后写了自定义结果。这使我能够抓取视图的内容。 (它是另一个也从基本控制器继承的控制器的一部分)。
我无法弄清楚:
阿尼尔
答案 0 :(得分:1)
这将从同一控制器中的第一个控制器动作调用第二个控制器动作:
public ActionResult FirstAction()
{
// Do FirstAction stuff here.
return this.SecondAction(ArgumentsIfAny);
}
public ActionResult SecondAction()
{
// Do SecondAction stuff here.
return View();
}
不需要太复杂。 : - )
答案 1 :(得分:0)
大多数MVC框架的想法让它变得更简单。所有内容都分解为对具有某些输入和某些返回值的方法的调用。在某种程度上,你可以通过做这样的事情来完成你想要的事情:
class MyController {
public ActionResult Action1() {
// Do stuff 1
}
public ActionResult Action2() {
// Do stuff 2
}
}
然后你可以重构一下:
class MyController {
public ActionResult Action1() {
// Pull stuff out of ViewData
DoStuff1(param1, param2, ...);
}
public ActionResult Action2() {
DoStuff2(param1, param2, ...);
}
public void DoStuff1(/* parameters */) {
// Do stuff 1
}
public void DoStuff2(/* parameters */) {
// Do stuff 2
}
}
现在你可以直接调用DoStuff1()和DoStuff2()因为它们只是方法。如果可能,您可以将它们设为静态。不要忘记你可能需要对错误检查和返回类型做些什么。
答案 2 :(得分:0)
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
this.ViewData.Model = GLB_MODEL;
Stream filter = null;
ViewPage viewPage = new ViewPage();
viewPage.ViewContext = new ViewContext(filterContext.Controller.ControllerContext, new WebFormView("~/Views/Customer/EmailView.aspx", ""), this.ViewData, this.TempData);
var response = viewPage.ViewContext.HttpContext.Response;
response.Clear();
var oldFilter = response.Filter;
try
{
filter = new MemoryStream();
response.Filter = filter;
viewPage.ViewContext.View.Render(viewPage.ViewContext, viewPage.ViewContext.HttpContext.Response.Output);
response.Flush();
filter.Position = 0;
var reader = new StreamReader(filter, response.ContentEncoding);
string html = reader.ReadToEnd();
}
finally
{
if (filter != null)
{
filter.Dispose();
}
response.Filter = oldFilter;
}
}
这是Render a view as a string代码的修改版本。我不想将视图的结果呈现给httpcontext响应流。