0

在我的 ASP.NET MVC 应用程序中,我在视图的脚本部分中有这个 AJAX 调用:

$(".ckbx").change(function () {
. . .
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetUnitReportPairVals", "Home")',
        data: { unit: unitval, report: rptval },
        cache: false,
        success: function (result) {
            alert(result);
        }
    });
});

单步执行被调用的 Controller 操作:

public ActionResult GetUnitReportPairVals(string unit, string report)
{
    HomeModel model = new HomeModel();

    int rptId = GetReportIDForName(report);

    DataTable UnitReportPairEmailValsDT = new DataTable();
    UnitReportPairEmailValsDT = SQL.ExecuteSQLReturnDataTable(
        SQL.UnitReportPairEmailQuery, 
        CommandType.Text, 
        new SqlParameter()
                {
                    ParameterName = "@Unit",
                    SqlDbType = SqlDbType.VarChar,
                    Value = unit
                },
                new SqlParameter()
                {
                    ParameterName = "@RptID",
                    SqlDbType = SqlDbType.Int,
                    Value = rptId
                }
                );

    model.UnitReportPairEmailVals = UnitReportPairEmailValsDT;
    return View(model);
}

...一切似乎都运行良好;“模型”包含 UnitReportPairEmailVals 中的预期值。

但我从未在 Ajax 调用中看到来自此处的警报消息:

success: function (result) {
    alert(result);
} 

那么为什么没有达到jQuery AJAX调用的“成功”功能呢?

更新

顺便说一句,这可能是一个线索:我的 Controller 方法的最后一行:

return View(model);

...将“视图”一词涂成红色,就像罗德岛公鸡的梳子一样。但如果它不应该是那样,它应该是什么?这与我在“public ActionResult Index()”控制器动作末尾的完全相同,它工作正常。

更新 2

我将 Ajax 调用的结尾更改为:

success: function (result) {
    alert(result);
},
failure: function (error) {
    alert(error);
}

...以及我的 Controller 方法的结尾:

return Json(new { Result = model }, JsonRequestBehavior.AllowGet);

...但我没有得到任何警报,无论是成功还是失败。

更新 3

注意:当我尝试这个时:

var model = JSON.stringify({ unit: unitval, report: rptval });
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetUnitReportPairVals", "Home")',
        data: model,
        contentType: 'application/json',
        cache: false,
        success: function (result) {
            alert(result);
        },
        error: function (result) {
            debugger;
        }
    });

...“单位”是空的,所以它根本不会飞。

当我将其更改为此(删除第 1 行并将“数据”参数更改回我之前使用的内容)时:

$.ajax({
    type: 'GET',
    url: '@Url.Action("GetUnitReportPairVals", "Home")',
    data: { unit: unitval, report: rptval }, 
    contentType: 'application/json',
    cache: false,
    success: function (result) {
        alert(result);
    },
    error: function (result) {
        alert('failed');
    }
});

......“单位”是我所期望的(和“报告”,也是),但我最终看到“失败”。

更新 4

一旦我将几个不同的答案和相关问题拼凑在一起,我就在这里写了一个关于如何做到这一点的提示。

更新 5

我有这个 [工作] ajax 调用 [工作]:

var model = JSON.stringify({ unit: unitval, report: 1 });
$.ajax({
    type: 'GET',
    url: '@Url.Action("GetUnitDataRangeParamsVals", "UnitReportDataRangeParams")',
    data: { unit: unitval, report: 1 },
    contentType: 'application/json',
    cache: false,
    success: function (returneddata) {
        populatedatarangeprams(1, returneddata);
    },
    error: function () {
        alert('error - returneddata.error.stringify');
    }
});

...但我没有使用声明的“模型”,根据我的理解,它与“contentType:'application/json'”配对

所以我想我应该做的是这样的事情:

var model = JSON.stringify({ unit: unitval, report: 1 });
$.ajax({
    type: 'GET',
    url: '@Url.Action("GetUnitDataRangeParamsVals", "UnitReportDataRangeParams")',
    data: model,
    contentType: 'application/json',
    cache: false,
    success: function (returneddata) {
        populatedatarangeprams(1, returneddata);
    },
    error: function () {
        alert('error - returneddata.error.stringify');
    }
});

现在传递给控制器​​方法的数据是 json 字符串化格式(封装在“模型”中)。

但是,它甚至不起作用。

它适用于第一个块,但不适用于第二个。

所以我删除了“模型”和“内容类型”行,并将“数据”行改回原来的样子,它工作正常。那么它们是无用的,还是我错误地使用它们?

4

2 回答 2

1

以下是我在 ASP.NET MVC 中执行 ajax 时使用的一些片段。

$(".ckbx").change(function () {
    .....
    var model = JSON.stringify({ unit: unitval, report: rptval });
    $.ajax({
        type: 'GET',
        url: '@Url.Action("GetUnitReportPairVals", "Home")',
        data: model,
        contentType: 'application/json',
        cache: false,
        success: function (result) {
            alert(result);
        },
        error: function(result) {
            debugger;
        }
    });
});

有时这两个更改(与您的原始更改相比)不是必需的,但如果 json 不正确,ASP.NET 可能会有点挑剔,这有助于解决这个问题。由于您可以进入控制器方法,这不是您的问题,但它可以很方便。

您真正的问题是控制器方法的返回类型。ActionResult 意味着它将寻找相应的视图并基于该视图构建 html。但是如果你在做ajax,那么你可能不想要那个。

public JsonResult GetUnitReportPairVals(string unit, string report)
{
    // do some stuff
    // then create response model
    var model = ...//whatever data you are returning here
    return Json(model);
}

这是 ASP.NET MVC 中 ajax 调用的“标准”方法。

正如您在评论中指出的那样, ActionResult 在 Index 方法中效果很好。是的,因为 index 方法的目的是加载页面。通常,如果该方法用于加载页面,那么您将使用 ActionResult,因为它将使用视图来为该页面创建 html。但是,如果您只是提交信息然后返回诸如“成功”之类的响应,那么您不需要完整的 html 响应,您需要 json。这就是 JsonResult 在这里工作的原因。

于 2016-04-21T21:28:51.397 回答
1

我怀疑您没有为此操作创建视图,并且在出现异常时会导致 ajax 调用失败,因为 razor 引擎将无法找到视图。确保此操作存在视图,或者如果要返回其他视图,请指定以下内容:

 return View(model,"ViewName");

您还可以添加失败回调以查看问题所在:

success: function (result) {
            alert(result);
        },
error: function(error){
           console.log(error);
        }

更新:

如果您只想返回数据,请使用 Json:

return Json(new {Result = model },JsonRequestBehavior.AllowGet);
于 2016-04-21T21:33:53.247 回答