我可以将ViewBag属性返回给Ajax成功回调吗?

时间:2016-05-26 12:27:18

标签: asp.net asp.net-mvc

我从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);
}

2 个答案:

答案 0 :(得分:4)

这不可能,因为数据参数只是在执行PartialView("SomePartialView", someModel)时生成的HTML字符串

一个选项如下:

在您的控制器操作中添加Response.Headers["Counter"] = 5

在你的ajax.success中,接受两个额外的参数statusxhr,这样你的成功函数就像这样:

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); 
                       },