ASP.NET:从视图到控制器的POST List <object> /带有Ajax(JSON)的模型

时间:2018-07-27 08:28:09

标签: javascript asp.net ajax razor model

ASP.NET CorePOSTList的{​​{1}}中Items工作。理想情况下,我想传递整个Ajax,但是我无法正确匹配签名(因为传递ReportViewModelDateTime并不容易)。 / p>

我的问题

  1. 如何从具有List的视图中POST到控制器中的List<Object>
  2. 如何从具有Ajax的视图POST到控制器中的Model

我目前有以下代码:

模型

Ajax

视图(ReportView)

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
}

控制器(ReportController)

@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]

2 个答案:

答案 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: truecache: false属性吗?

控制器

[HttpPost]
public JsonResult CreatePDF([FromBody] ReportViewModel model)
{
    // Lots of code
    return Json(new { isError = false });
}

查看(仅适用于JS)

$.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
});