C# 将JSON对象绑定到ViewModel

C# 将JSON对象绑定到ViewModel,c#,json,asp.net-mvc-4,asp.net-web-api,model-binding,C#,Json,Asp.net Mvc 4,Asp.net Web Api,Model Binding,如何将JSON对象(从Web API返回)映射到视图模型。 [我正在使用automapper将我的c#业务对象映射到视图模型。我正在寻找类似于将JSON映射到视图模型的东西] 我收到以下错误:“无法将当前JSON对象反序列化为类型‘System.Collections.Generic.IEnumerable`1[CLAW.BLL.MLAReports.Models.CMAReport]”,因为该类型需要JSON数组” 这是我的控制器在Webapi中的签名 namespace ReportsAPI

如何将JSON对象(从Web API返回)映射到视图模型。 [我正在使用automapper将我的c#业务对象映射到视图模型。我正在寻找类似于将JSON映射到视图模型的东西]

我收到以下错误:“无法将当前JSON对象反序列化为类型‘System.Collections.Generic.IEnumerable`1[CLAW.BLL.MLAReports.Models.CMAReport]”,因为该类型需要JSON数组”

这是我的控制器在Webapi中的签名

namespace ReportsAPI.Controllers
{
    public class ReportsController : ApiController
    {
    [HttpPost]
    public CMAReportVM Reports([FromBody] StatsCriteria criteria)
    {
      var cmaReport = Service3.GetCMAReport(criteria.Masnums);
       //Create Map to enable mapping business object to View Model
                 Mapper.CreateMap<CMAReport, CMAReportVM>();
       // Maps model to VM model class 
                 var cmaVM = Mapper.Map<CMAReport, CMAReportVM>(cmaReport);
      reutn cmaVM; 
    }
}
}
namespace ReportsAPI.Controllers
{
公共类报表控制器:ApiController
{
[HttpPost]
公共CMAReportVM报告([FromBody]StatsCriteria标准)
{
var cmaReport=Service3.GetCMAReport(criteria.Masnums);
//创建映射以启用将业务对象映射到视图模型
CreateMap();
//将模型映射到VM模型类
var cmaVM=Mapper.Map(cmaReport);
reutn-cmaVM;
}
}
}
以下是客户端控制器的签名:

 namespace MASReports.Controllers
    {
        public ActionResult Reports(StatsCriteria criteria)
            {
             var client = new HttpClient();
             client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
             var response = client.PostAsJsonAsync("http://localhost:52765/api/reports", criteria.Masnums.ToString()).Result;

// The below line I get error.
            var represlt= response.Content.ReadAsAsync<IEnumerable<CMAReportVM>>().Result;

             return View("CMAReportVM", represlt);
            }
    }


Here's the signature for the model :


    namespace MLAReports.Models
    {
        public class CMAReportVM:ReportsVM
        {
            public CMAReportVM()    {}
            public List<Cma_Item> CmaList { get; set; }
            public string TimeStampString { get; set; }
            public Dictionary<string, string> CriteriaNameValue { get; set; }
        }  
    }


    namespace CLAW.BLL.MLAReports.Models
    {
        public class Cma_Item : IStatsGridable<Cma_Fields>
        { 
            public Cma_Item()            {}

            #region Properties and Fields
            public string PropTypeName { get; set; }
            public string StatusName { get; set; }
            public string LowP { get; set; }
            public string LowXStLP { get; set; }
            public string HighP { get; set; }
            public decimal? AvgLPFnl { get; set; }
            public decimal? AvgSPFnl { get; set; }    
            #endregion

            #region IStatsGrid Properties


            public List<string> Headers
            {
                get
                { return _headers;     }
                set
                { _headers = value;    }
            }    
            private IEnumerable<Cma_Fields> _rowModels;
            public IEnumerable<Cma_Fields> RowModels
            {
                get
                {      return _rowModels;}
                set
                {     _rowModels = value;}
            }

            private List<string> _headers;
            private string _id;
            #endregion

        }
    }

    namespace CLAW.BLL.MLaReports.Models
    {
        public interface IStatsGridable<T>
        {
             List<string> Headers { get; set; }
             string Id { get; set; }
             IEnumerable<T> RowModels { get; set; }
        }
    }


    namespace CLAW.BLL.MLAReports.Models
    {
        public class Cma_Fields
        {

            public Cma_Fields()         {   }

            #region Properties and Fields
            public string Mlanum { get; set; }
            public string Address { get; set; }
            public string BR { get; set; }
            public string BA { get; set; }
            public string SF { get; set; }

            public string TRId
            {
                get
                { return _trid;     }
                set
                {_trid = value;     }
            }
          #endregion
        }
    }
namespace MASReports.Controllers
{
公共行动结果报告(StatsCriteria标准)
{
var client=新的HttpClient();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var response=client.PostAsJsonAsync(“http://localhost:52765/api/reports“,criteria.Masnums.ToString())。结果;
//下面的一行我得到了错误。
var represult=response.Content.ReadAsAsync().Result;
返回视图(“CMAReportVM”,represlt);
}
}
以下是该型号的签名:
名称空间MLAReports.Models
{
公共类CMAReportVM:ReportsVM
{
公共CMAReportVM(){}
公共列表CmaList{get;set;}
公共字符串TimeStampString{get;set;}
公共字典标准NameValue{get;set;}
}  
}
命名空间CLAW.BLL.MLAReports.Models
{
公共类Cma_项目:IStatsGridable
{ 
公共Cma_项(){}
#区域属性和字段
公共字符串PropTypeName{get;set;}
公共字符串StatusName{get;set;}
公共字符串LowP{get;set;}
公共字符串LowXStLP{get;set;}
公共字符串HighP{get;set;}
公共十进制数?AvgLPFnl{get;set;}
公共十进制数?AvgSPFnl{get;set;}
#端区
#区域网格属性
公共列表标题
{
得到
{返回_头;}
设置
{u headers=value;}
}    
私有IEnumerable模型;
公共IEnumerable模型
{
得到
{返回_rowModels;}
设置
{{u rowModels=value;}
}
私有列表标题;
私有字符串_id;
#端区
}
}
命名空间CLAW.BLL.MLaReports.Models
{
公共接口IStatsGridable
{
列表标题{get;set;}
字符串Id{get;set;}
IEnumerable行模型{get;set;}
}
}
命名空间CLAW.BLL.MLAReports.Models
{
公共类Cma_字段
{
公共Cma_字段(){}
#区域属性和字段
公共字符串Mlanum{get;set;}
公共字符串地址{get;set;}
公共字符串BR{get;set;}
公共字符串BA{get;set;}
公共字符串SF{get;set;}
公共字符串TRId
{
得到
{return\u trid;}
设置
{u trid=value;}
}
#端区
}
}
内部异常:


{“无法将当前JSON对象(例如,{“name\”:\“value\”})反序列化为'System.Collections.Generic.IEnumerable`1[CLAW.BLL.MLAReports.Models.CMAReport]'类型,因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。\r\n若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3])或者更改反序列化类型,使其成为可以从JSON对象反序列化的普通.NET类型(例如,不是integer之类的基元类型,也不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到该类型,以强制其从JSON对象反序列化。\r\n路径“CmaList”,第1行,位置11。“}

您的报表控制器签名返回单个项目

public CMAReportVM Reports([FromBody] StatsCriteria criteria)
但你试着把它解读成可数的

var represlt= response.Content.ReadAsAsync<IEnumerable<CMAReportVM>>().Result;
var represult=response.Content.ReadAsAsync().Result;

请显示您的视图,因为我们需要查看您如何发回json对象。您好,我更新了问题。我正在将JSON对象从Webapi发回我的控制器,并在控制器中将其映射到Viewmodel。谢谢Allan。我很感激。呵呵!!其中一个愚蠢的错误。在那里,那样做。有时候,你盯着某件事看了太久,以至于错过了显而易见的东西,很高兴我能帮上忙!