c# - jQuery AJAX 总是执行错误 : {}

标签 c# jquery ajax http-post

我正在开发一个 Web 应用程序,ASP.Net MVC 4.0 和 Entity Framework 6.0,尝试根据用户选择更新数据库。使用 jQuery AJAX 将数据发送到 Controller 的操作。下面给出的是更新实体的 C# 代码,实体又更新数据库。

public void modidyProduct(Productdetail prodData)  
{  
    try  
    {  
        using (SampleTrialEntities entity = new SampleTrialEntities())  
        {  
            var data = entity.Productdetails.Where(p=>p.ProductID == prodData.ProductID).FirstOrDefault<Productdetail>();  
            data.ProductName = prodData.ProductName;  
            data.ProductNumber = prodData.ProductNumber;  
            data.CategoryName = prodData.CategoryName;  
            data.ModelName = prodData.ModelName;  
            entity.Entry(data).State = System.Data.Entity.EntityState.Modified;  
            entity.SaveChanges();  
        }  
    }  
    catch (Exception)  
    {}  
}

这是对该 Controller 操作方法的 jQuery AJAX 调用。

function updateProduct() {  
        var productData = {  
            ProductName: $('#prodName').val().trim(),  
            ProductNumber: $('#prodNum').val().trim(),  
            CategoryName: $('#ctgryName :selected').text(),  
            ModelName: $('#mdlName :selected').text(),  
            ProductID: atob($('#editProductId').val())  
        };  
        debugger;  
        $('#divLoader').show();  
        $.ajax({  
            url: '@Url.Action("modidyProduct", "Home")',  
            data: JSON.stringify(productData),  
            type: 'POST',  
            dataType: 'json',  
            contentType: 'application/json;charset=utf-8',  
            success: function (jqXHR) {  
                //Below line will destroy DataTable - tblProducts. So that we could bind table again. next line - loadData();  
                $('#tblProducts').DataTable().destroy();  
                $('#divLoader').hide();  
                loadData();  
                $('#addModal').modal('hide');  
                $('#editProductId').val('');  
            },  
            error: function (msg) {  
                debugger;  
                $('#editProductId').val('');  
                $('#divLoader').hide();  
                alert(msg);  
                alert("What's going wrong ?");  
                //alert(jqXHR.responseText);  
            }  
        });  
    }

执行 jQuery AJAX 方法和 Controller 操作后,成功更新数据库中的记录。返回响应状态码 - 200 和状态 - OK。但只有错误:{ },在AJAX方法中每次都会执行代码块。 Debugging screen capture with status-OK; statuscode - 200

最佳答案

$.ajax 方法调用的这一部分

dataType: 'json', 

它告诉 jQuery,ajax 调用代码需要返回有效的 JSON 响应,但当前服务器方法的返回类型为 void。这意味着它不会返回任何内容,并且 $.ajax 方法正在尝试解析响应(假设它是有效的 JSON),从而获得典型的 “解析器错误”

当数据类型为json并且从服务器收到响应时,会严格解析数据;任何格式错误的 JSON 都会被拒绝并引发解析错误。从 jQuery 1.9 开始,空响应也会被拒绝。

解决方案是简单地删除调用中的 dataType 属性。

$.ajax({
        url: '@Url.Action("modidyProduct", "Home")',
        data: JSON.stringify(productData),
        type: 'POST',
        contentType: 'application/json;charset=utf-8'
    }).done(function() {
        console.log('Success');
    })
    .fail(function(e, s, t) {
        console.log('Failed');
    });

或者您可以更新服务器操作方法以返回 json 响应。

[HttpPost]
public ActionResult ModidyProduct(Productdetail prodData)
{
    try
    {
        //to do : Save  
    }
    catch (Exception ex)
    {
        //to do : Log the exception
        return Json(new { status = "error", message=ex.Message });
    }
    return Json(new { status="success"});
}

现在在客户端代码中,您可以检查 json 响应以查看交易是否成功

$.ajax({
        url: '@Url.Action("ModidyProduct", "Home")',
        data: JSON.stringify(productData),
        type: 'POST',
        contentType: 'application/json;charset=utf-8',
        dataType: 'json',
}).done(function (res) {
    if (res.status === 'success') {
        alert('success');
    } else {
        alert(res.message);
    }
        console.log('Success');
 }).fail(function(e, s, t) {
        console.log('Failed');
 });

您不必指定 dataType 属性值。如果没有指定任何内容,jQuery 将尝试根据返回的响应的 mime 类型来推断它,在这种情况下,响应内容类型将为 application/json;字符集=utf-8。所以你应该表现得很好。

关于c# - jQuery AJAX 总是执行错误 : {},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46994832/

相关文章:

c# - Gridview 绑定(bind)到数据表编辑下拉列表 C#

javascript - 按下文本链接后弹出内容不显示

jquery - 如何在 css 列表中使用 jquery 交换类/id?

javascript - 多次 AJAX 调用后执行代码

javascript - jQuery/JS 等待图像宽度调整

c# - 计算两个日期之间的差异返回负数

c# - 从代码隐藏向 JavaScript 函数传递参数

php - ajax 和 php 更新 mysql

c# - 如何防止 SQL 注入(inject)攻击?

javascript - 使用 JavaScript 禁用事件选项卡按钮