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