我目前的代码如下所示。如何将我的数组传递给控制器以及控制器操作必须接受哪种参数?
function getplaceholders() {
var placeholders = $('.ui-sortable');
var result = new Array();
placeholders.each(function() {
var ph = $(this).attr('id');
var sections = $(this).find('.sort');
var section;
sections.each(function(i, item) {
var sid = $(item).attr('id');
result.push({ 'SectionId': sid, 'Placeholder': ph, 'Position': i });
});
});
alert(result.toString());
$.post(
'/portal/Designer.mvc/SaveOrUpdate',
result,
function(data) {
alert(data.Result);
}, "json");
};
我的控制器操作方法看起来像
public JsonResult SaveOrUpdate(IList<PageDesignWidget> widgets)
答案 0 :(得分:84)
我找到了解决方案。我使用了Steve Gentile的解决方案, jQuery and ASP.NET MVC – sending JSON to an Action – Revisited 。
我的ASP.NET MVC视图代码如下:
function getplaceholders() {
var placeholders = $('.ui-sortable');
var results = new Array();
placeholders.each(function() {
var ph = $(this).attr('id');
var sections = $(this).find('.sort');
var section;
sections.each(function(i, item) {
var sid = $(item).attr('id');
var o = { 'SectionId': sid, 'Placeholder': ph, 'Position': i };
results.push(o);
});
});
var postData = { widgets: results };
var widgets = results;
$.ajax({
url: '/portal/Designer.mvc/SaveOrUpdate',
type: 'POST',
dataType: 'json',
data: $.toJSON(widgets),
contentType: 'application/json; charset=utf-8',
success: function(result) {
alert(result.Result);
}
});
};
我的控制器操作使用自定义属性
进行修饰[JsonFilter(Param = "widgets", JsonDataType = typeof(List<PageDesignWidget>))]
public JsonResult SaveOrUpdate(List<PageDesignWidget> widgets
可以找到自定义属性的代码here(此链接现已中断)。
因为链接断开,所以这是JsonFilterAttribute
的代码public class JsonFilter : ActionFilterAttribute
{
public string Param { get; set; }
public Type JsonDataType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
{
string inputContent;
using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
{
inputContent = sr.ReadToEnd();
}
var result = JsonConvert.DeserializeObject(inputContent, JsonDataType);
filterContext.ActionParameters[Param] = result;
}
}
}
JsonConvert.DeserializeObject来自Json.NET
答案 1 :(得分:22)
动作过滤器,jquery stringify,bleh ......
Peter,这个功能是MVC的原生功能。这是让MVC如此出色的事情之一。
$.post('SomeController/Batch', { 'ids': ['1', '2', '3']}, function (r) {
...
});
在行动中,
[HttpPost]
public ActionResult Batch(string[] ids)
{
}
像魅力一样:
如果你正在使用jQuery 1.4+,那么你想看看设置传统模式:
jQuery.ajaxSettings.traditional = true;
这甚至适用于复杂的物体。如果您有兴趣,可以查看有关模型绑定的MVC文档:http://msdn.microsoft.com/en-us/library/dd410405.aspx
答案 2 :(得分:10)
在.NET4.5
中,MVC 5
不需要小部件。
<强>使用Javascript:强>
JS中的对象:
发布的机制。
$('.button-green-large').click(function() {
$.ajax({
url: 'Quote',
type: "POST",
dataType: "json",
data: JSON.stringify(document.selectedProduct),
contentType: 'application/json; charset=utf-8',
});
});
<强> C#强>
对象:
public class WillsQuoteViewModel
{
public string Product { get; set; }
public List<ClaimedFee> ClaimedFees { get; set; }
}
public partial class ClaimedFee //Generated by EF6
{
public long Id { get; set; }
public long JourneyId { get; set; }
public string Title { get; set; }
public decimal Net { get; set; }
public decimal Vat { get; set; }
public string Type { get; set; }
public virtual Journey Journey { get; set; }
}
控制器:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Quote(WillsQuoteViewModel data)
{
....
}
收到的对象:
希望这可以节省你一些时间。
答案 3 :(得分:8)
在 Create REST API using ASP.NET MVC that speaks both JSON and plain XML 的下半部分引用:
然后,他实现了一个动作过滤器,它将JSON映射到C#对象并显示代码。现在我们需要接受通过HTTP POST提供的JSON和XML有效负载。有时,您的客户可能希望一次上传一组对象以进行批处理。因此,他们可以使用JSON或XML格式上传对象。 ASP.NET MVC中没有本机支持来自动解析发布的JSON或XML并自动映射到Action参数。所以,我写了一个过滤器来做到这一点。“
答案 4 :(得分:7)
首先下载此JavaScript代码JSON2.js,它将帮助我们将对象序列化为字符串。
在我的示例中,我通过Ajax发布了jqGrid的行:
var commissions = new Array();
// Do several row data and do some push. In this example is just one push.
var rowData = $(GRID_AGENTS).getRowData(ids[i]);
commissions.push(rowData);
$.ajax({
type: "POST",
traditional: true,
url: '<%= Url.Content("~/") %>' + AREA + CONTROLLER + 'SubmitCommissions',
async: true,
data: JSON.stringify(commissions),
dataType: "json",
contentType: 'application/json; charset=utf-8',
success: function (data) {
if (data.Result) {
jQuery(GRID_AGENTS).trigger('reloadGrid');
}
else {
jAlert("A problem ocurred during updating", "Commissions Report");
}
}
});
现在在控制器上:
[HttpPost]
[JsonFilter(Param = "commissions", JsonDataType = typeof(List<CommissionsJs>))]
public ActionResult SubmitCommissions(List<CommissionsJs> commissions)
{
var result = dosomething(commissions);
var jsonData = new
{
Result = true,
Message = "Success"
};
if (result < 1)
{
jsonData = new
{
Result = false,
Message = "Problem"
};
}
return Json(jsonData);
}
创建一个JsonFilter类(感谢JSC参考)。
public class JsonFilter : ActionFilterAttribute
{
public string Param { get; set; }
public Type JsonDataType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
{
string inputContent;
using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
{
inputContent = sr.ReadToEnd();
}
var result = JsonConvert.DeserializeObject(inputContent, JsonDataType);
filterContext.ActionParameters[Param] = result;
}
}
}
创建另一个类,以便过滤器可以将JSON字符串解析为实际的可操作对象:此类comissionsJS是我的jqGrid的所有行。
public class CommissionsJs
{
public string Amount { get; set; }
public string CheckNumber { get; set; }
public string Contract { get; set; }
public string DatePayed { get; set; }
public string DealerName { get; set; }
public string ID { get; set; }
public string IdAgentPayment { get; set; }
public string Notes { get; set; }
public string PaymentMethodName { get; set; }
public string RowNumber { get; set; }
public string AgentId { get; set; }
}
我希望这个例子有助于说明如何发布复杂的对象。
答案 5 :(得分:0)
我的天哪。不需要做任何特别的事情。仅在您的帖子部分中执行以下操作:
$.post(yourURL,{ '': results})(function(e){ ...}
在服务器中使用此:
public ActionResult MethodName(List<yourViewModel> model){...}
this link帮助您完成...
答案 6 :(得分:-1)
[HttpPost]
public bool parseAllDocs([FromBody] IList<docObject> data)
{
// do stuff
}