【发布时间】: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