Ajax POST参数[assetID]的空条目?

时间:2015-02-24 17:19:08

标签: c# jquery json asp.net-mvc asp.net-mvc-5

我正在使用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>
}

当我尝试运行功能时,我的ajax总是error并且我的控制器操作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

有人能发现我可能出错的地方吗?在我的脚本的第一个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的回答之后,我意识到他确实是正确的,并且我精神上跳了一把枪宣布我的data字段作为verified_date传递给所有我打算将ID值传递给我的控制器操作中的预期参数。由于verification_date不等于assetID(预期参数),因此该动作从未实际调用过,并且失败为NULL

以下更新的代码:

SCRIPT

<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);
    }

2 个答案:

答案 0 :(得分:1)

首先,这可能不起作用。

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,而您的控制器看不到实际内容param它正在寻找所以它只需要NULL。

答案 1 :(得分:0)

一般来说,我处理服务器请求的方法是使用postman之类的工具对其进行测试。这将允许您在没有代码的情况下使Post调用工作。我只需使用表格数据的键值对,然后像这样标记你的电话:

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

那应该适合你。然后你需要从邮递员那里学到所学知识,并在javascript中做同样的事情。

修改 删除“首先我不会使用JSON将您的ID发布到服务器”来自评论。