Ajax POST 参数 [assetID] 的条目为空?
Ajax POST has null entry for parameter [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>
}
当我尝试 运行 通过功能时,我的 ajax
总是 error
ing 并且我的控制器操作 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 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);
}
一般来说,我处理对服务器的请求的方式是使用 postman 之类的工具对其进行测试。这将使您无需代码即可使 Post 调用正常工作。我只会使用表单数据的键值对,然后像这样标记您的调用:
[HttpPost]
[Route("{assetID}")]
public JsonResult verifyAsset(int assetID)
{
这应该适合你。然后你需要把你从邮递员那里学到的东西带到javascript.
中做同样的事情
编辑:
从评论中删除了 "First of all I wouldn't use JSON to post your Id to the server"。
首先,这可能行不通。
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。
我正在使用 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
ing 并且我的控制器操作 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 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);
}
一般来说,我处理对服务器的请求的方式是使用 postman 之类的工具对其进行测试。这将使您无需代码即可使 Post 调用正常工作。我只会使用表单数据的键值对,然后像这样标记您的调用:
[HttpPost]
[Route("{assetID}")]
public JsonResult verifyAsset(int assetID)
{
这应该适合你。然后你需要把你从邮递员那里学到的东西带到javascript.
中做同样的事情编辑: 从评论中删除了 "First of all I wouldn't use JSON to post your Id to the server"。
首先,这可能行不通。
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。