【问题标题】:Can I return a ViewBag property to Ajax success callback?我可以将 ViewBag 属性返回给 Ajax 成功回调吗?
【发布时间】:2016-05-28 05:46:52
【问题描述】:

我正在从 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 中返回 Counter。

解决方案:

我最终像这样重写了我的控制器:

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

【问题讨论】:

  • 没有。只需使用return Json(5);date 的值为 5
  • 你想在返回的部分视图中使用 ViewBag.Counter 吗?
  • 不,我需要 ViewBag.Counter 来处理部分视图之外的内容。
  • @brinch - 好的。然后可以在部分视图的隐藏字段中设置计数器值并在 ajax 成功中访问。
  • @brinch,如有必要,进行 2 个 ajax 调用 - 一个用于返回部分,一个用于返回值。或者将值放在隐藏的输入中,并在将其添加到 DOM 时从输入中读取。

标签: asp.net asp.net-mvc


【解决方案1】:

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

一个选项如下:

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

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

success: function (data, status, xhr) {

在此之后,您可以使用 xhr.getResponseHeader("Counter"),它将为您提供 5(或您选择传入的任何内容)

【讨论】:

    【解决方案2】:

    请像这样使用您的操作中的返回语法...

    return Json(new { success = ViewBag.Counter }, JsonRequestBehavior.AllowGet);
    

    像这样在您的视图上获得响应...

    success: function (data) {
                         alert(data.success); 
                           },
    

    【讨论】:

    • 你也可以直接传递你的计数器值而不是 ViewBag.Counter。
    • @brinch - 您可以将带有模型的计数器传递给局部视图。
    • @Ajinder:不,这不是一个选项,因为我将在局部视图之外使用 Counter。
    • 你刚才改了问题,我给你答案请稍等
    • 如果你想在 ajax 成功中访问某些东西,你必须改变你的返回类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多