Ajax POST对参数[assetID]有空条目?

我正在使用GridMVC在我的一个网格列中显示一个按钮,以充当资产验证按钮。 基本上,单击按钮时,我想根据ID在数据库中查找相关资产,并将[verified_date]设置为DateTime.Now

columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => @<a href="#" class="btn btn-default btn-sm noDecoration" onclick="verifyAsset(@o.Id)"><span class="glyphicon glyphicon-ok"></span> @*View*@</a>).SetWidth(15);

在上面使用超链接标记,我打电话给我的verifyAsset() javascript函数:

@section Scripts {

    <script type="text/javascript">
        function verifyAsset(assetID) {
            alert("The assetID is: " + assetID);
            var data = { verified_date: assetID };
            alert("Got this far...");
            $.ajax({
                type: "POST",
                dataType: "JSON",
                url: '@Url.Action("verifyAsset", "INV_Assets")',
                data: data,
                success: function (resp) {
                    alert("Success! Asset " + resp.ID + " successfully verified on " + resp.VDate);
                },
                error: function (resp) {
                    alert("There was an error verifying this Asset...");
                }
            });
        }
    </script>
}

当我尝试通过funcitonality时,我的ajax总是error并且我的Controller Action verifyAsset()的断点永远不会被达到:

    [HttpPost]
    public JsonResult verifyAsset(int assetID)
    {
        INV_Assets asset = db.INV_Assets.Find(assetID);
        asset.verified_date = DateTime.Now;

        try
        {
            if (ModelState.IsValid)
            {
                db.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
        }

        return Json(new { ID = asset.Id, VDate = asset.verified_date }, JsonRequestBehavior.AllowGet);
    }

在我的Elmah日志中返回的错误是: The parameters dictionary contains a null entry for parameter 'assetID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.JsonResult verifyAsset(Int32)' in 'InventoryTracker.Controllers.INV_AssetsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters The parameters dictionary contains a null entry for parameter 'assetID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.JsonResult verifyAsset(Int32)' in 'InventoryTracker.Controllers.INV_AssetsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters The parameters dictionary contains a null entry for parameter 'assetID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.JsonResult verifyAsset(Int32)' in 'InventoryTracker.Controllers.INV_AssetsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

任何人都可以发现我可能会出错的地方吗? 在我的脚本的第一个alert() ,我已经确认正确的ID值被传递给变量assetID的函数,但是我注意到,如果我尝试将data设置为: var data = { verified_date: @Convert.ToInt32(assetID) }; assetID标志not exist in the current context ...?


编辑

以下是我之前得到的类似代码:

脚本

    $('#submitNewModel').click(function () {
        var form = $(this).closest('form');
        var data = { description: document.getElementById('textNewModel').value };
        //var data = { model_description: document.getElementById('textNewModel').value, created_date: @DateTime.Now, created_by: @System.Environment.UserName };
        $.ajax({
            type: "POST",
            dataType: "JSON",
            url: '@Url.Action("createNewModel", "INV_Assets")',
            data: data,
            success: function (resp) {
                $('#selectModel').append($('<option></option>').val(resp.ID).text(resp.Text));
                form[0].reset();
                $('#createModelFormContainer').hide();
            },
            error: function () {
                alert("ERROR!");
            }
        });
    });

INV_AssetsController - createNewModel()

    [HttpPost]
    public JsonResult createNewModel(string description)
    {
        INV_Models model = new INV_Models()
        {
            // ID auto-set during save.
            model_description = description,
            created_date = DateTime.Now,
            created_by = System.Environment.UserName
        };

        try
        {
            if (ModelState.IsValid)
            {
                db.INV_Models.Add(model);
                db.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
        }

        return Json(new { ID = model.Id, Text = model.model_description }, JsonRequestBehavior.AllowGet);
    }

在回顾了gutsmania的回答之后,我意识到他确实是正确的,并且当我打算将ID值传递给控制器​​操作中的预期参数时,我精神上跳起了枪声明我的data字段正在传递为verified_date 。 由于verification_date不等于assetID (期望的参数),所以该操作从未被实际调用并且失败为NULL

更新下面的代码:

脚本

<script type="text/javascript">
    function verifyAsset(assetID) {
        alert("The assetID is: " + assetID);
        var data = { asset_ID: assetID };
        alert("Got this far...");
        $.ajax({
            type: "POST",
            dataType: "JSON",
            url: '@Url.Action("verifyAsset", "INV_Assets")',
            data: data,
            success: function (resp) {
                alert("Success! Asset " + resp.ID + " successfully verified on " + resp.VDate);
            },
            error: function (resp) {
                alert("There was an error verifying this Asset...");
            }
        });
    }
</script>

INV_AssetsController - verifyAssets()

    [HttpPost]
    public JsonResult verifyAsset(int asset_ID)
    {
        INV_Assets asset = db.INV_Assets.Find(asset_ID);
        asset.verified_date = DateTime.Now;

        try
        {
            if (ModelState.IsValid)
            {
                db.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
        }

        return Json(new { ID = asset.Id, VDate = asset.verified_date }, JsonRequestBehavior.AllowGet);
    }

首先,这可能不起作用。

var data = { verified_date: @Convert.ToInt32(assetID) };

除非您将assetID范围作为服务器端变量(并且错误消息似乎表明您没有)。 你不能在JS对象上使用Razor助手。 这就是所有的错误信息所表明的。

其次,你击中了你的控制器,这很好,但它没有选择你的参数,这是不好的。

我会看看这一行:

            var data = { verified_date: assetID };

你的控制器正在寻找一个名为assetID的变量,并且你传递了一个名为verified_date的东西。 我目前没有可用的VS来重新检查,但我知道当预期的参数名称和通过ajax请求传递的参数名称之间存在不相容时,我遇到了这些问题。 使用Fiddler或其他一些工具来检查你实际发送的内容,但由于你没有在ajax调用中明确地设置你的contentType,你的消息体可能类似于verified_date = someValue,而你的控制器没有看到实际的它正在寻找,所以它只需要NULL。


通常,我如何处理对服务器的请求是使用邮递员等工具对其进行测试。 这将允许您在没有代码的情况下工作。 我只需使用表单数据的键值对,然后像这样标记您的呼叫:

[HttpPost]
[Route("{assetID}")]
public JsonResult verifyAsset(int assetID)
{

这应该为你获得。 然后你需要从邮递员那里学到什么,并在JavaScript中做同样的事情。

编辑:删除“首先我不会使用JSON发布您的ID到服务器”从评论。

链接地址: http://www.djcxy.com/p/46159.html

上一篇: Ajax POST has null entry for parameter [assetID]?

下一篇: Send JSON data to a WebMethod