在ASP.NET Core
到POST
到List
的{{1}}中Items
工作。理想情况下,我想传递整个Ajax
,但是我无法正确匹配签名(因为传递ReportViewModel
或DateTime
并不容易)。 / p>
List
的视图中POST
到控制器中的List<Object>
?Ajax
的视图POST
到控制器中的Model
?我目前有以下代码:
Ajax
public class ReportViewModel {
public int ReportType { get; set; };
public DateTime DateFrom { get; set; };
public DateTime DateTo { get; set; };
public List<Item> ItemList{ get; set; };
}
public class Item {
// Properties are simple types
}
@model Namespace.ViewModels.ReportViewModel
@inject Namespace.Resource Resources
<!-- HTML code -->
<form>
<button class="ui button" type="submit" onclick="return createPDF();">@Resources.Save</button>
</form>
<script>
function createPDF() {
alertify.set('notifier', 'position', 'bottom-left');
$.ajax({
type: "POST",
url: "CreatePDF",
data: JSON.stringify({
reportType: @Model.ReportType,
ticksDateFrom: @Model.DateFrom.Ticks,
ticksDateTo: @Model.DateTo.Ticks
@* TODO: Add the List<Items> itemList (from @Model.ItemList)*@
}),
contentType: 'application/json',
// Code for success and error
});
return false;
};
</script>
我尝试按如下所示传递模型,但这使控制器中的参数为[HttpPost]
public JsonResult CreatePDF([FromBody] dynamic data) {
// Lots of code
return Json(new { isError = false });
}
/* When passing the entire model
* [HttpPost]
* public JsonResult CreatePDF([FromBody] ReportViewModel model) {
* // Lots of code
* return Json(new { isError = false });
* }
*/
或作为新的“空”对象,这取决于我是否使用null
。
[FromBody]
答案 0 :(得分:1)
您可以在发布到控制器的视图中使用BeginForm:
@model Namespace.ViewModels.ReportViewModel
@inject Namespace.Resource Resources
@using (Html.BeginForm("CreatePDF", "[PDFControllerName]", FormMethod.Post, new { @id = "pdfCreatorForm" }))
{
<!-- Send parameters to a controller like this (invisibly) -->
@Html.HiddenFor(m => m.ReportType)
@Html.HiddenFor(m => m.DateFrom.Ticks)
@Html.HiddenFor(m => m.DateTo.Ticks)
@Html.HiddenFor(m => m.ItemList) <!-- Send the List<Items> -->
<button type="submit" class="ui button" onclick="alertify.set('notifier', 'position', 'bottom-left')">@Resources.Save</button>
}
然后您就不再需要JavaScript,另外要记住的另一件事是,在服务器端尽可能多地保留功能。
如果将表单发布到控制器,则可以像下面这样访问视图的参数:
public JsonResult CreatePDF(ReportViewModel formData)
{
int reportType = formData.ReportType;
DateTime ticksDateFrom = formData.DateFrom.Ticks;
DateTime ticksDateTo = formData.DateTo.Ticks;
List<Items> itemList = formData.ItemList;
// Lots of code
}
而且,您实际上不需要指定它正在接收HttpPost :)
答案 1 :(得分:0)
我不知道为使它正常工作需要进行什么更改,但是以下内容可以正确编译。可能是processData: true
和cache: false
属性吗?
[HttpPost]
public JsonResult CreatePDF([FromBody] ReportViewModel model)
{
// Lots of code
return Json(new { isError = false });
}
$.ajax({
type: "POST",
url: "CreatePDF",
data: JSON.stringify(@Html.Raw(Json.Serialize(Model))),
contentType: 'application/json; charset=utf-8',
processData: true,
cache: false,
// Code for success and error
});