【问题标题】:ViewBag on a Javascript code mvc 4Javascript代码mvc 4上的ViewBag
【发布时间】:2014-02-11 16:02:33
【问题描述】:

我在执行此操作时遇到了问题:我有一个 ViewBag,其中包含文档 ID 列表和每个文档的响应时间,创建方式如下:

控制器

ViewBag.Documents= (from n in db.DocumentType
                     select new {a = n.DocumentTypeId, b=n.ResponseTime});

根据用户在下拉列表中选择的文档,javascript 代码计算处理文档的实际持续时间(持续时间)。

DocumentId(int)          Response(int)
    1                     2 days
    2                     3 days
    3                     1 day

完整的 javascript 代码根据响应时间计算最终日期,不包括周末和节假日,但唯一不工作的部分是 JavaScript 代码的以下部分:

视图中的 JavaScript:

function CalculateTime(documenttype) {
                var duration= 0;
                var jScriptArray= new Array();
                var array = '@Html.Raw(Json.Encode(ViewBag.Documents))';
                for (var i = 0; i < array.length; i++) {
                    for (var j = 0; j < 2; j++) {
                        jScriptArray [i][j] = array [i][j];
                    }
                }
                for (i = 0; i < jScriptArray.length; i++) {
                   if (documenttype== jScriptArray [i][0]) duration= jScriptArray [i][1];
                }
                return duration;
            }

我已经有了基于下拉列表的正确 documenttype 变量,但此脚本无法正常工作。我认为这是我想要使用 ViewBag 的方式,但我不太确定。我需要知道的是:我的代码或其他方法有什么问题。

提前致谢

【问题讨论】:

  • 您应该先将其编码为 JSON,然后再将其发送到 ViewBag。
  • 这是因为您的 JavaScript 变量 array 通过在 JSON 中使用引号将其设置为字符串值。

标签: c# javascript asp.net-mvc-4


【解决方案1】:

去掉引号

 var array = @Html.Raw(Json.Encode(ViewBag.Documents));

【讨论】:

  • TypeError: 在 Web Developer 控制台中数组为空
  • @ASP_beginner,调试您的应用程序并查看控制器操作在ViewBag.Documents 中放入了什么,然后执行console.log(@Html.Raw(Json.Encode(ViewBag.Documents)))
【解决方案2】:

只需删除引号('),您必须为此使用 Newtonsoft.Json。

var array = @Newtonsoft.Json.JsonConvert.SerializeObject(ViewBag.Documents);

这会起作用。

【讨论】:

  • 即使“;”中有语法错误在上面的代码中,这将完美地工作。
  • 如果我删除引号显示我的数组为空。如果我在该语句中使用引号...在 Web 开发人员控制台上显示 TypeError: "jScriptArray[i] is undefined"。
  • 您需要在项目中添加 Newtonsoft.Json.dll 才能运行该语句。
【解决方案3】:

我的一个朋友帮我解决了我的问题。你们中的一些人告诉我使用 Json,所以我们这样做了:

控制器:

using System.Web.Script.Serialization;
using Newtonsoft.Json;

...

var timeList= db.DocumentType.ToList();

ViewBag.ResponseTimes= new JavaScriptSerializer().Serialize(
                JsonConvert.SerializeObject(new
                {
                    times= (from obj in timeList
                               select new { DocumentTypeId= obj.DocumentTypeId, ResponseTime= obj.ResponseTime})
                }, Formatting.None));

视图中的 JavaScritp:

function CalculateTime(documenttype) {
                var duration = 0;
                var jScriptArray = new Array();
                var array = $.parseJSON(@Html.Raw(ViewBag.ResponseTimes));
            for (i = 0; i < array.times.length; i++) {
                if (parseInt(documenttype) == array.times[i].DocumentTypeId) {
                    duration= array.times[i].ResponseTimes;
                }
            }
            return duration;
        }

谢谢!

PS:我不知道这两个答案中的哪一个给出了接受的原因,我们使用了两者的一部分......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多