您好我在尝试将数据从js文件传递到我的MVC控制器中的Action时遇到问题。这是我的控制者。
[HttpPost]
[CustomAuthorize(Roles.Administrator, Roles.ContextOwner, Roles.DataOwner, Roles.DataSteward)]
public JsonResult SaveChangesOnGrid(int id, string json)
{
var codeViewModels = JsonConvert.DeserializeObject<CodeViewModel[]>(json);
var error = string.Empty;
CodeViewModel newViewModel = null;
foreach (var viewModel in codeViewModels)
{
viewModel.CodeListId = id;
if (ModelState.IsValid)
{
error = codeService.Validate(viewModel);
if (string.IsNullOrEmpty(error))
{
newViewModel = codeService.SaveToStage(viewModel);
}
}
else
{
error = "Could not save";
}
}
if (id > 0 && string.IsNullOrEmpty(error))
{
// notify
var codeList = codeListService.GetCurrentCodeListById(id);
notifyGroup.NotifyDataOwnerGroup(codeList);
}
return Json(new
{
error,
newViewModel
});
}
当我使用HTTPPOst注释时,我再也无法使用它了。我正在尝试使用我视图上的按钮访问Action。我尝试了两种不同的方法,但都没有。
<a id="review_btn" class="btn btn-primary" href='@Url.Action("SaveChangesOnGrid", "Code", new {id = Model.CodeListId })'>Submit for Review</a>
编辑:按钮的HTML输出
<div class="btn-group offset10" style="margin-top: 20px; margin-bottom: 20px">
<a id="review_btn" class="btn btn-primary" href='/ReferenceData.Web/Code/SaveChangesOnGrid/13'>Submit for Review</a>
</div>
在我的JS文件中,我有一个函数试图将JSon数组传递给我的控制器操作编辑更新了Ajax:当按下按钮时,现在有一个内部服务器错误Http 500。当我在开发人员工具中检查网络包时,它会显示带有JSON数据包
的HTTP数据包 function rowsToJson(obj) {
var selRowIds = $("#CodeGrid").jqGrid('getGridParam', 'selarrrow');
if (selRowIds.length > 0) {
var rowData = jQuery('#CodeGrid').jqGrid('getRowData', selRowIds[0]);
var selectedRowsData = [{ "Code": rowData.Code, "ParentCode": rowData.ParentId, "Name": rowData.Name, "Description": rowData.Description }];
for (var i = 1; i < selRowIds.length; i++) {
rowData = jQuery('#CodeGrid').jqGrid('getRowData', selRowIds[i]);
selectedRowsData.push({ "CodeId": rowData.CodeId, "Code": rowData.Code, "ParentCode": rowData.ParentId, "Name": rowData.Name, "Description": rowData.Description });
}
$.ajax({
url: window.g_baseUrl + 'Code/SaveChangesOnGrid',
type: 'POST',
data: JSON.stringify(selectedRowsData),
dataType: 'json',
contentType: 'application/json; charset=utf-8',
async: true,
processData: false
});
//$(obj).attr('href', obj.href + "?json=" + JSON.stringify(selectedRowsData));
return true;
}
else {
alert("Please select a code");
return false;
}
};
$(function () {
$('#review_btn').click(function () {
if (confirm('These Selected Changes will be submitted for approval \n\n Are you sure you wish to proceed?')) {
return rowsToJson(this);
} else {
$('#CodeGrid').jqGrid('resetSelection');
return false;
}
});
});
你可以从我已经注释掉的内容中看到我尝试过使用AJAX,只是将JSON作为字符串附加到URL的末尾。
使用AJAX并从按钮中删除了href我得到一个错误500.如果我在调试到我的控制器时将href保留,则json参数为null。
如果我使用HTTPPost注释将JSON数组附加到URL的末尾,则json参数为null。当我删除注释时,JSON会被传递,但是当我单步执行代码时,会抛出一个错误,告诉我有关JSON和Get的安全问题
如果可能的话,我更愿意使用Ajax,因为它避免了URL中用户可以看到的数据。但我真的只想得到一些有用的东西。
答案 0 :(得分:1)
首先,忘记使用GET,它看起来很难看,如果JSON太大,可能会失败。 看一下如何设置动作:
Calling WebMethod returning IList<T> from Jquery Ajax with NHibernate And MVC
在这里:
http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx
按照以上示例尝试简化此操作。
我认为这里需要JSON.Stringify。同时删除角色注释,直到您的代码运行为止。
答案 1 :(得分:0)
您发布的数据与您的操作签名不符。您可以在调试控制台的预览或响应选项卡上查看异常详细信息。
您的行动签名:
[HttpPost]
public JsonResult SaveChangesOnGrid(int id, string json)
您的POST正在发送:
var selectedRowsData = [{ "Code": rowData.Code, "ParentCode": rowData.ParentId, "Name": rowData.Name, "Description": rowData.Description }];
selectedRowsData.push({ "CodeId": rowData.CodeId, "Code": rowData.Code, "ParentCode": rowData.ParentId, "Name": rowData.Name, "Description": rowData.Description });
$.ajax({
...
data: JSON.stringify(selectedRowsData)
});
预期的是:
var selectedRowsData = [{ "Code": "", "ParentCode": "", "Name": "", "Description": "" }];
$.ajax({
...
data: JSON.stringify({ "id": "1", "json": JSON.stringify(selectedRowsData) });
});
这可能不是你想要的......
请尝试使用
让框架进行绑定和反序列化。
var selectedRowsData = [];
for (var i = 1; i < selRowIds.length; i++) {
rowData = jQuery('#CodeGrid').jqGrid('getRowData', selRowIds[i]);
selectedRowsData.push({ "CodeId": rowData.CodeId, "Code": rowData.Code, "ParentCode": rowData.ParentId, "Name": rowData.Name, "Description": rowData.Description });
}
$.ajax({
...
data: JSON.stringify(selectedRowsData)
});
现在创建一个镜像JSON对象的模型。 (你的CodeViewModel
?)
public class Country
{
public int CodeId { get; set; }
public string Code { get; set; }
public string ParentCode { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
更改操作签名
[HttpPost]
public JsonResult SaveChangesOnGrid(Country[] codes)
...然后忘记手动反序列化数据。