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

C# 通过ajax将模型传递给控制器(结果为空/混乱),c#,jquery,ajax,asp.net-mvc,C#,Jquery,Ajax,Asp.net Mvc,我问了一个关于这个问题的问题。我尝试了所有给出的解决方案,但都没有用。我想我遇到的问题是我没有正确设置参数的数据类型 我在这里试图做的是从一个控制器接收一个模型,当另一个动作发生时,我会将该模型连同预插入的值一起传递回控制器。(我不想给服务器打几个电话) 有什么方法可以让我接收到数据的原样吗?也就是说,如果我将模型传递给控制器,控制器将接收整个数据,而不是字符串 我的代码如下: ViewFacilities.html(查看) 当我尝试发送模型时,我在控制器中获得的数据,以及控制器参数的字符串数据

我问了一个关于这个问题的问题。我尝试了所有给出的解决方案,但都没有用。我想我遇到的问题是我没有正确设置参数的数据类型

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

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

我的代码如下:

ViewFacilities.html(查看)

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

facilityTypeId=2&ftm=Tp.Cis.Tprbs.Models.FacilityTypeModel&bdList=System.Collections.Generic.List%601%5BTp.Cis.Tprbs.Models.BlockOutDateModel%5D¤tTerms=System.Collections.Generic.List%601%5BTp.Cis.Tprbs.Models.AcademicalCalendarModels%5D&OpenHouryHourTime=System.Collections.Generic.List%601%5D%5D&firstDate=10%2F02%2F2017+00%3A00%3A00&lastDate=19%2F02%2F2017+18%3A21%3A15

当我尝试将数据类型改为模型类时,我得到一个空值:

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

任何帮助都很好

这里有一些事情,但您的主要问题似乎是您正在尝试将复杂类型(例如,
currentTerms
)序列化到简单的隐藏字段中。您不能这样做(如果事情真的那么简单,那就太好了!)-因此,当您将数据发布回服务器时,您将获得类型的字符串表示形式(例如
Tp.Cis.Tprbs.Models.FacilityTypeModel

我会做几件事:

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

public ActionResult RetrieveTimeslots(ViewFacilitiesModel viewModel) { .. }
该框架非常擅长将发布到服务器的JSON数据绑定到强类型模型

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

  • 向客户端发送一些JSON,并使用JavaScript处理字符串化
  • 想出一种复杂的方法来呈现列表中每个项目的隐藏元素
  • 简化视图模型,甚至将其分解为更小的块,以便只渲染简单类型

  • 就我个人而言,我会选择JS方式,但无论您选择何种方式,您都需要“管理”列表/复杂类型,以便在HTML中只呈现原始值。

    您有多个问题。首先,
    bdList
    currentTerms
    openHours
    是复杂对象的集合。不能对集合或复杂对象使用隐藏输入(查看您生成的html以了解为什么它永远不会绑定。但是,您究竟为什么要将所有数据发送到客户端,然后再原封不动地发送回来?既然您有一个视图模型,为什么它不包括
    chosenDate
    facilityid
    的属性?@Stephen Muecke chosenDate和facilityid都是没问题。这些值是从客户端检索的。我之所以要传递未更改的值,是因为我必须在视图控制器和其他控制器中使用这些值,这需要调用服务器。我只是不想进行多次调用。关于复杂对象,我想这会解释很多问题。如果我要删除它们并保留简单的。参数的数据类型是什么?它是模型吗?我知道它们不是问题!只将对象的ID传递给控制器,然后在服务器中再次获取数据(假设您的数据库设置正确,那么调用数据库的速度会非常快。将数据发送到客户端然后再通过网络返回的速度会非常快。恶意用户可以在您不知情的情况下轻松修改数据)我想我会简化模型。因此,关于将模型发送到控制器,我是用同样的方法,即序列化?还是只需执行@HTML.URL(“RetrieveTimeslots”、“Booking”、“model”)。@AdamLoh-最简单的方法是序列化表单。注意-表单输入需要具有与ViewModel上的属性匹配的名称(区分大小写)
    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
    }
    
    public ActionResult RetrieveTimeslots(DateTime chosenDate, int facilityid, ViewFacilitiesModel vfmx){
            //receive ajax data here
        }
    
    public ActionResult RetrieveTimeslots(ViewFacilitiesModel viewModel) { .. }