通过ajax将模型传递给控制器​​(结果为空/混乱)

时间:2017-02-10 10:38:21

标签: c# jquery ajax asp.net-mvc

我问了一个关于这个问题的问题。我已经尝试了所有解决方案但无济于事。我认为我遇到的问题是我没有正确设置参数的数据类型?

我在这里要做的是从控制器接收模型,当另一个动作发生时,我会将该模型以及预先插入的值传回控制器。 (我不想打几次电话给服务器)。

有什么办法可以接收数据吗?也就是说,如果我将模型传递给控制器​​,控制器将接收整个数据,而不是字符串。

我的代码如下:

ViewFacilities.html(查看)

@using Tp.Cis.Tprbs
@model Tp.Cis.Tprbs.Models.ViewFacilitiesModel

<form id="my-hidden-form">
    @Html.HiddenFor(m => m.facilityTypeId)
    @Html.HiddenFor(m => m.ftm)
    @Html.HiddenFor(m => m.bdList)
    @Html.HiddenFor(m => m.currentTerms)
    @Html.HiddenFor(m => m.openHours)
    @Html.HiddenFor(m => m.firstDate)
    @Html.HiddenFor(m => m.lastDate)
</form>

<script type="text/javascript">
function getTimeSlots(date, facilityid) {
                var date = $('#datepicker').datepicker('getDate');
                $.ajax({
                    url: "@Url.Action("RetrieveTimeslots", "Booking")",
                    data: {
                        'chosenDate': date.toISOString(),
                        'facilityid': document.getElementById('selectFacilities').value,
                        'vfmx': $("#my-hidden-form").serialize(),
                    },
                    dataType: "json",
                    traditional: true,
                    cache: false,
                    success: function (data) {
                        console.log('data here', data);
                    }
                });
</script>

ViewFacilitiesModel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tp.Cis.Tprbs.Models
{
    public class ViewFacilitiesModel
    {
        public Array disabledDates { get; set; }
        public string maxDate { get; set; }
        public List<TimeSlotsModel> allSlots { get; set; }
        public int facilityTypeId { get; set; }
        public FacilityTypeModel ftm { get; set; }
        public List<BlockOutDateModel> bdList { get; set; }
        public List<AcademicCalendarModel> currentTerms { get; set; }
        public List<OpeningHourModel> openHours { get; set; }
        public DateTime firstDate { get; set; }
        public DateTime lastDate { get; set; }
    }
}

控制器

public virtual ActionResult ViewFacilities(string facilitytype, int facilitytypeid){

            ViewFacilitiesModel vfm = new ViewFacilitiesModel();
            vfm.disabledDates = listOfFullBlockDates.ToArray();
            vfm.maxDate = endDate.ToString("yyyy-MM-dd");
            vfm.facilityTypeId = facilitytypeid;
            vfm.ftm = ftm;
            vfm.bdList = bdList;
            vfm.currentTerms = currentTerms;
            vfm.openHours = openHours;
            vfm.firstDate = dtNow.Date;
            vfm.lastDate = endDate;


            var tempFacility = facilitytype;
            return View(vfm);
}

public ActionResult RetrieveTimeslots(DateTime chosenDate, int facilityid, string vfmx){
    //receive ajax data here
}

我尝试发送模型时在控制器中获得的数据,以及控制器参数的字符串数据类型是:

facilityTypeId = 2及FTM = Tp.Cis.Tprbs.Models.FacilityTypeModel&安培; bdList = System.Collections.Generic.List%601%5BTp.Cis.Tprbs.Models.BlockOutDateModel%5D&安培; currentTerms =系统。 Collections.Generic.List%601%5BTp.Cis.Tprbs.Models.AcademicCalendarModel%5D&安培; openHours = System.Collections.Generic.List%601%5BTp.Cis.Tprbs.Models.OpeningHourModel%5D&安培; firstDate = 10%2F02% 2F2017 + 00%3A00%3A00&安培; lastDate = 19%2F02%2F2017 + 18%3A21%3A15

当我尝试将数据类型更改为Model类时,我得到一个null:

public ActionResult RetrieveTimeslots(DateTime chosenDate, int facilityid, ViewFacilitiesModel vfmx){
        //receive ajax data here
    }

任何帮助都会很棒

1 个答案:

答案 0 :(得分:0)

这里有一些事情,但您的主要问题似乎是您尝试将复杂类型(例如currentTerms)序列化为简单的隐藏字段。你不能这样做(如果事情那么容易就会很棒!) - 因此当你将数据发回服务器时,你得到的是字符串表示形式(例如Tp.Cis.Tprbs.Models.FacilityTypeModel)。 / p>

我做了一些事情:

将帖子操作的签名更改为仅接受视图模型

public ActionResult RetrieveTimeslots(ViewFacilitiesModel viewModel) { .. }

该框架非常擅长将发布到服务器的JSON数据绑定到强类型模型。

如果您必须保留对象列表,那么我认为您有三个选择:

  1. 将一些JSON发送到客户端并使用JavaScript
  2. 处理它
  3. 提出了一种为列表中的每个项目呈现隐藏元素的复杂方式
  4. 简化您的视图模型,甚至将其分解为更小的块,以便您只是渲染简单类型
  5. 就个人而言,我是沿着JS路线前进的,但无论你选择什么,你都需要“管理”#34;列表/复杂类型,只有在HTML中呈现原始值。