2

我正在使用 asp.net mvc4 并在访问 viewbag.price 时遇到一些问题。

这就是我正在做的事情:-

 [HttpPost]
    public ActionResult FillModel(int id)
    {
        var vehModel = db.Vehicle_Model.Where(vehMod => vehMod.MakeID == id).ToList().Select(vehMod => new SelectListItem() { Text = vehMod.Model, Value = vehMod.pkfModelID.ToString() });

        ViewBag.Price = 100;
        return Json(vehModel, JsonRequestBehavior.AllowGet);
    }

我在上面使用以下方法调用:-

  $.ajax({
            url: '@Url.Action("FillModel","Waranty")',
            type: 'post',
            data: { id: id },
            dataType: 'json',
            success: function (data) {
                $('#ddModel').empty();
                $.each(data, function (index, val) {
                    var optionTag = $('<option></option>');
                    $(optionTag).val(val.Value).text(val.Text);
                    $('#ddModel').append(optionTag);
                });

                var a = '@ViewBag.Price';
            },
            error: function () {
                alert('Error');
            }
        });

但我无法访问 ViewBag.Price。

有谁知道原因吗??

谢谢

4

1 回答 1

0

您无法从 ajax 成功函数中的 ViewBag 访问项目的原因是,包含您的脚本的视图已经由 Razor 视图引擎呈现,有效地将变量设置为当时a的值@ViewBag.Price页面被渲染。

查看流程可能会有所帮助:

(1) 请求进入其中包含您的脚本片段的视图。

(2) 调用返回视图的控制器方法。

(3) Razor 视图引擎遍历视图并将视图@ViewBag.Price中的任何引用替换为 的实际值ViewBag.Price。假设ViewBag.Price还没有值,脚本中的成功函数现在是

success: function (data) {
    $('#ddModel').empty();
    $.each(data, function (index, val) {
        var optionTag = $('<option></option>');
        $(optionTag).val(val.Value).text(val.Text);
        $('#ddModel').append(optionTag);
    });

    var a = '';
}

(4) 渲染的 html 被发送到客户端

(5) 你的ajax请求被触发

(6) 成功时,a设置为空字符串。

正如您在问题的评论中提到的,此问题的解决方案是包含a在您的操作方法返回的 Json 对象中,并data.a在您的脚本中使用它来访问它。返回线看起来像

return Json(new { 
    model =  vehModel,
    a = Price
});

请记住,如果您这样做,您将不得不在您的 ajax 成功函数中使用data.model.Field. 此外,您不需要指定该JsonRequestBehavior.AllowGet选项,因为您的方法只响应帖子,而您的 ajax 请求是帖子。

于 2016-05-02T21:48:24.037 回答