我问了一个关于这个问题的问题。我已经尝试了所有解决方案但无济于事。我认为我遇到的问题是我没有正确设置参数的数据类型?
我在这里要做的是从控制器接收模型,当另一个动作发生时,我会将该模型以及预先插入的值传回控制器。 (我不想打几次电话给服务器)。
有什么办法可以接收数据吗?也就是说,如果我将模型传递给控制器,控制器将接收整个数据,而不是字符串。
我的代码如下:
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
}
任何帮助都会很棒
答案 0 :(得分:0)
这里有一些事情,但您的主要问题似乎是您尝试将复杂类型(例如currentTerms
)序列化为简单的隐藏字段。你不能这样做(如果事情那么容易就会很棒!) - 因此当你将数据发回服务器时,你得到的是字符串表示形式(例如Tp.Cis.Tprbs.Models.FacilityTypeModel
)。 / p>
我做了一些事情:
将帖子操作的签名更改为仅接受视图模型
public ActionResult RetrieveTimeslots(ViewFacilitiesModel viewModel) { .. }
该框架非常擅长将发布到服务器的JSON数据绑定到强类型模型。
如果您必须保留对象列表,那么我认为您有三个选择:
就个人而言,我是沿着JS路线前进的,但无论你选择什么,你都需要“管理”#34;列表/复杂类型,只有在HTML中呈现原始值。