在我的MVC网站上,我正在创建一个小型论坛。对于一个帖子,我在我的“PostController”中呈现我的“单(帖子后)”动作,如下所示
<% Html.RenderAction<PostController>(p => p.Single(comment)); %>
此外,当用户回复帖子时,我将回复作为ajax请求发送到我的“CreatePost”操作,然后返回“单个”视图作为此操作的结果,如下所示
public ActionResult CreatePostForForum(Post post)
{
//Saving post to DB
return View("Single", postViewData);
}
当我确实只想渲染视图时,“单个”动作体中的代码不会被执行。
这样做的最佳方式是什么?
另外,我想在我的JsonObject中将“Single”动作结果作为字符串返回,如下所示
return Json(new{IsSuccess = true; Content= /*HERE I NEED Single actions result*/});
答案 0 :(得分:0)
你可以使用这样的东西,但要非常小心。它实际上可能导致严重的可跟踪错误(例如,当您忘记在Single方法中显式设置视图名称时)。
public ActionResult Single(PostModel model) {
// it is important to explicitly define which view we should use
return View("Single", model);
}
public ActionResult Create(PostModel model) {
// .. save to database ..
return Single(model);
}
清洁解决方案的做法与从标准格式发布一样 - 重定向(XMLHttpRequest将遵循它)
为了返回包含在json中的ajax视图,我使用以下类
public class AjaxViewResult : ViewResult
{
public AjaxViewResult()
{
}
public override void ExecuteResult(ControllerContext context)
{
if (!context.HttpContext.Request.IsAjaxRequest())
{
base.ExecuteResult(context);
return;
}
var response = context.HttpContext.Response;
response.ContentType = "application/json";
using (var writer = new StringWriter())
{
var oldWriter = response.Output;
response.Output = writer;
try
{
base.ExecuteResult(context);
}
finally
{
response.Output = oldWriter;
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
response.Write(serializer.Serialize(new
{
action = "replace",
html = writer.ToString()
}));
}
}
}
这可能不是最好的解决方案,但效果很好。请注意,您需要手动设置View,ViewData.Model,ViewData,MasterName和TempData属性。
答案 1 :(得分:0)
我的建议: