Yus*_*tme 16 c# arrays asp.net-mvc post json
我正在尝试将JSON数组发布到MVC控制器.但无论我尝试什么,一切都是0或null.
我有这个包含文本框的表.我需要从所有文本框中将ID和值作为对象.
这是我的Javascript:
$(document).ready(function () {
$('#submitTest').click(function (e) {
var $form = $('form');
var trans = new Array();
var parameters = {
TransIDs: $("#TransID").val(),
ItemIDs: $("#ItemID").val(),
TypeIDs: $("#TypeID").val(),
};
trans.push(parameters);
if ($form.valid()) {
$.ajax(
{
url: $form.attr('action'),
type: $form.attr('method'),
data: JSON.stringify(parameters),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (result) {
$('#result').text(result.redirectTo)
if (result.Success == true) {
return fase;
}
else {
$('#Error').html(result.Html);
}
},
error: function (request) { alert(request.statusText) }
});
}
e.preventDefault();
return false;
});
});
Run Code Online (Sandbox Code Playgroud)
这是我的查看代码:
<table>
<tr>
<th>trans</th>
<th>Item</th>
<th>Type</th>
</tr>
@foreach (var t in Model.Types.ToList())
{
{
<tr>
<td>
<input type="hidden" value="@t.TransID" id="TransID" />
<input type="hidden" value="@t.ItemID" id="ItemID" />
<input type="hidden" value="@t.TypeID" id="TypeID" />
</td>
</tr>
}
}
</table>
Run Code Online (Sandbox Code Playgroud)
这是我试图接收数据的控制器:
[HttpPost]
public ActionResult Update(CustomTypeModel ctm)
{
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
Dar*_*rov 58
您的代码存在很多问题.让我们从标记开始.你有一张桌子,在这张桌子的每一行里面你都有隐藏的字段.除非您id
对这些隐藏元素的属性进行了硬编码,这意味着您最终可能会在标记中使用具有相同ID的多个元素,从而导致无效标记.
所以让我们首先修复你的标记:
@foreach (var t in Model.Types.ToList())
{
<tr>
<td>
<input type="hidden" value="@t.TransID" name="TransID" />
<input type="hidden" value="@t.ItemID" name="ItemID" />
<input type="hidden" value="@t.TypeID" name="TypeID" />
</td>
</tr>
}
Run Code Online (Sandbox Code Playgroud)
好的,现在你有了有效的标记.现在让我们继续讨论submitTest
单击某个按钮时将触发的javascript事件.如果这是表单的提交按钮,我建议您订阅.submit
表单.click
事件而不是其提交按钮的事件.这样做的原因是,例如,如果用户在焦点位于某个输入字段内时按下Enter键,则可以提交表单.在这种情况下,您的点击事件不会被触发.
所以:
$(document).ready(function () {
$('form').submit(function () {
// code to follow
return false;
});
});
Run Code Online (Sandbox Code Playgroud)
好的,接下来是你需要收集表中隐藏元素的值并将它们放入javascript对象的部分,我们随后将JSON序列化并作为AJAX请求的一部分发送到服务器.
让我们继续:
var parameters = [];
// TODO: maybe you want to assign an unique id to your table element
$('table tr').each(function() {
var td = $('td', this);
parameters.push({
transId: $('input[name="TransID"]', td).val(),
itemId: $('input[name="ItemID"]', td).val(),
typeId: $('input[name="TypeID"]', td).val()
});
});
Run Code Online (Sandbox Code Playgroud)
到目前为止,我们已经填充了参数,现在让它们发送到服务器:
$.ajax({
url: this.action,
type: this.method,
data: JSON.stringify(parameters),
contentType: 'application/json; charset=utf-8',
success: function (result) {
// ...
},
error: function (request) {
// ...
}
});
Run Code Online (Sandbox Code Playgroud)
现在让我们转到服务器端.我们一如既往地定义视图模型:
public class MyViewModel
{
public string TransID { get; set; }
public string ItemID { get; set; }
public string TypeID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及将采用此模型集合的控制器操作:
[HttpPost]
public ActionResult Update(IList<MyViewModel> model)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这是最终的客户端代码:
$(function() {
$('form').submit(function () {
if ($(this).valid()) {
var parameters = [];
// TODO: maybe you want to assign an unique id to your table element
$('table tr').each(function() {
var td = $('td', this);
parameters.push({
transId: $('input[name="TransID"]', td).val(),
itemId: $('input[name="ItemID"]', td).val(),
typeId: $('input[name="TypeID"]', td).val()
});
});
$.ajax({
url: this.action,
type: this.method,
data: JSON.stringify(parameters),
contentType: 'application/json; charset=utf-8',
success: function (result) {
// ...
},
error: function (request) {
// ...
}
});
}
return false;
});
});
Run Code Online (Sandbox Code Playgroud)
显然,如果您的视图模型不同(您未在问题中显示),则可能需要调整代码以使其与您的结构匹配,否则默认模型绑定器将无法反序列化JSON.
还有一种更简单的方法:使用Query String发送数据.如果您有兴趣,那么您当前的方法是错误的,因为JSON数组数据类型string
不是CustomTypeModel
.
首先,删除data
ajax选项.我们不再那样了.
其次,更改您的控制器,如下所示:
[HttpPost]
public ActionResult Update(string json)
{
// this line convert the json to a list of your type, exactly what you want.
IList<CustomTypeModel> ctm =
new JavaScriptSerializer().Deserialize<IList<CustomTypeModel>>(json);
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
注意1:您的CustomTypeModel
属性名称与您作为JSON元素输入的名称相同非常重要.所以,你CustomTypeModel
应该是这样的:
public class CustomTypeModel
{
// int, or maybe string ... whatever you want.
public int TransIDs { get; set; }
public int ItemIDs { get; set; }
public int TypeIDs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
注意2:当您想通过查询字符串发送数据时,此方法很有用.所以,你的网址可以是这样的:
url: '/controller/action?json=' + JSON.stringify(trans)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
46329 次 |
最近记录: |