0

我们有一个 Web 项目,它从 MS SQL 数据库中获取数据,并使用 Google Visualization API 在 Web 视图上显示这些图表。

最近我们添加了城堡温莎,因此我们可以使用 XML 文件将应用程序配置给不同的用户。在我们添加它之前,视图运行良好,使用了该查询所需的内置参数。出于某种原因,当我们从 XML 文件中发送参数时(使用断点运行显示参数正在传递给页面的主控制器操作),没有返回数据。这是给你的一些代码。

JavaScript

<script type="text/javascript">
var csvDataUrl = '@Url.Action("TradeValuesDataCsv", "Dashboard")';
var jsonDataUrl = '@Url.Action("TradeValuesDataJson", "Dashboard")';
 google.load("visualization", "1", { packages: ['table', 'corechart', 'gauge'] });
 google.setOnLoadCallback(drawCharts);
 drawCharts();

 $("body").on({
     ajaxStart: function () {
         $(this).addClass("loading");
     },
     ajaxStop: function () {
         $(this).removeClass("loading");
     }
 });

function drawCharts() {
    var queryString = 'platform=' + $('#PlatformDropDownList').val();
    queryString += '&startDate=' + $('#startDatePicker').val();
    queryString += '&endDate=' + $('#endDatePicker').val();
    queryString += '&model=' + $('#ModelDropDownList').val();
    queryString += '&eventType=' + '@Model.EventType';
    queryString += '&parameterName=' + '@Model.ParameterName';
        $.ajax({
            type: "POST",
            url: jsonDataUrl,
            data: queryString,
            statusCode: {
                200: function (r) {
                    drawToolbar(queryString);
                    drawTable(r);
                    drawChart(r);
                },
                400: function (r) {

                },
                500: function (r) {

                }
            }
        });
}

此页面的主控制器方法:

        public ActionResult ActionResultName(EventTypeParameterNameEditModel model)
    {
        var viewModel = new EventTypeParameterNameViewModel(_queryMenuSpecific);
        viewModel.EventType = model.EventType;
        viewModel.ParameterName = model.ParameterName;
        PopulateFilters(viewModel);
        return this.View(viewModel);
    }

检索 JSON 数据控制器方法:

        public ActionResult ActionResultNameJson(EventTypeParameterNameEditModel filters)
    {
        List<CustomDataType> results = this.GetTradeValues(filters);
        return this.Json(results, JsonRequestBehavior.AllowGet);
    }

编辑我设法找到了一个解决方案,即使它是一个相当混乱的解决方案。我在页面中内置了一些过滤器,允许用户按设备和操作系统进行过滤,这些过滤器在页面加载时填充了“未定义”。我在第一次使用 NProf Running 时没有发现这种情况,但是在我们将输入配置为来自 XML 之前加载页面时并没有发生这种情况。我会将其添加为答案并接受并关闭问题。感谢大家尝试提供帮助。开始真正喜欢这个社区。作为研究生开发人员寻求帮助的理想场所。

4

2 回答 2

0

是的。我不是 Razor 语法专家,但我认为这些属性引用可能是您的问题。我怀疑 razor 会倾向于避免在 JS 上下文中具有属性的语句中使用的字符串中声明自己。或者您可以尝试实现可能会起作用的 getter 函数。否则一个 @ 和一个 . 如果不是一个明显的方法调用,在字符串中很容易导致混淆与电子邮件地址:

queryString += '&eventType=' + '@Model.EventType';
queryString += '&parameterName=' + '@Model.ParameterName';

作为任何服务器到客户端场景的一般规则,我的建议是将 JavaScript 直接从后端限制为 JSON 对象。这样一来,您就可以更精细地控制 http 请求墙两侧发生的事情,如果短期需要快速修改,您的客户端开发人员不必弄清楚东西是在哪里构建的。一般来说,如果可以避免的话,不要用其他代码构建行为代码。

起初我无法说服我的 .net MVC 老板,但几个月后他慢慢接受了这个想法。

We also store a URL base path along with some other context-shifting params in a standard JSON object that loads on every page so the JS devs can add these things linked JS files rather than have to work with JS in the HTML (I don't recall why but document.location wasn't always going to work).

Lastly, try to keep the JS out of the HTML. Link it. It seems like a pain from a procedural POV but trust me. It makes life much easier when you are juggling 3 major concerns as one ball each rather than all in the same jumbled HTML/template mess.

于 2012-08-03T20:29:58.243 回答
0

It turned out that the problem was not in my Javascript. I have some filters in there that allow the user to filter the results my model and operating system and date and what not. These were being automatically populated on page load with 'undefined' which is not an option in the database. I added something to catch that in the call to the query and it seemed to solve the problem.

于 2012-08-06T09:36:07.760 回答