我从ajax调用MVC控制器。控制器应该返回一个名为Counter:
的ViewBag属性public ActionResult GetSomething()
{
var someModel = ...
ViewBag.Counter = 5;
return PartialView("SomePartialView", someModel);
}
我通过ajax调用控制器。我想要的是在ajax成功回调中访问名为Counter的ViewBag属性。这可能吗?
$.ajax({
type: "POST",
url: "/GetSomething",
content: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
// How can I access Counter from here
},
});
PS:来自控制器的模型中的返回计数器不是一个选项。必须在ViewBag中。
更新:
使用返回值更新控制器,让您知道,我无法在Json中返回计数器。
解决方案:
我最终改写了我的控制器:
public JsonResult GetHeaderBasketPreview()
{
var someModel = ...
return Json(new { pViewHtml = HtmlHelpers.RenderViewToString(this.ControllerContext, "SomePartialView", someModel), counter = 5 });
}
它现在返回我的部分的html,加上我的计数器变量。
RenderViewToString看起来像这样(我在stackoverflow的答案中找到了这个辅助方法 - 但是不记得在哪里):
public static string RenderViewToString(ControllerContext context, string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = context.RouteData.GetRequiredString("action");
var viewData = new ViewDataDictionary(model);
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(context, viewName);
var viewContext = new ViewContext(context, viewResult.View, viewData, new TempDataDictionary(), sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
我现在可以在我的ajax成功回调中访问这两个变量:
success: function (data, status, xhr) {
$('#somePartialView').html(data.pViewHtml);
$('#counterIndicator').html(data.counter);
}
答案 0 :(得分:4)
这不可能,因为数据参数只是在执行PartialView("SomePartialView", someModel)
时生成的HTML字符串
一个选项如下:
在您的控制器操作中添加Response.Headers["Counter"] = 5
在你的ajax.success中,接受两个额外的参数status
和xhr
,这样你的成功函数就像这样:
success: function (data, status, xhr) {
在此之后,您可以使用xhr.getResponseHeader("Counter")
来5
(或您选择传入的任何内容)
答案 1 :(得分:1)
请使用您的操作中的返回语法,就像这样......
return Json(new { success = ViewBag.Counter }, JsonRequestBehavior.AllowGet);
在您的视图中获取响应......
success: function (data) {
alert(data.success);
},