2013-11-04 81 views
3

我试图将一个对象POST到接受一个复杂类型作为参数但收到参数为null的WebAPI控制器。任何想法为什么?该请求正确地击中了WebAPI方法,并且参数为空。webapi接收空参数

型号:

namespace DMAX.BLL.MASReports.Models 
{ 
    public class StatsCriteria 
     { 
      #region Constructors and Methods 
      public StatsCriteria() 
      { 

      } 
      #endregion 

      #region Properties and Fields 
      private string _masnum; 
      private string _notchosen; 
      private int _currentPage = 1; 
      private bool _isPrint = false; 
      private bool _isEmail = false; 
      private bool _isAjax = false; 
      public string Masnums { get { 
       if (!string.IsNullOrEmpty(_masnum)) { 
        _masnum = _masnum.Replace("'", ""); 
        if (!string.IsNullOrEmpty(NotChosen)) { 
         string[] notchosenlist = NotChosen.Split(','); 
         foreach (var notchosen in notchosenlist) { 
          _masnum = this.RemoveNotChosen(_masnum, notchosen); 
         } 
        } 
        return _masnum; 
       } 
       return null; 
      } 
       set { _masnum = value; } 
      } 

      public string AgentId { get; set; } 
      public string LicenseNum { get; set; } 
      public string AgentFullName { get; set; } 
      public string HeaderName { get; set; } 


      #endregion 
     } 
    } 
} 

下面是在客户端代码:[该StatsCriteria是项目BLL的一部分,我在MASReports项目引用它]

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; 
     return View("CMAReport", response); 
     } 
} 

这里的Webapi中我的控制器的签名。 [该StatsCriteria是项目BLL的一部分,我在ReportsAPI项目到项目的引用] [该CMAReportVM,CMAReport是项目BLL的一部分,我必须在ReportsAPIproject BLL项目的引用]

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; 
    } 
} 
} 

//这是我的路由:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 

,这里是我的Web API的Golbal.asax

namespace ReportsAPI 
{ 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 

    public class WebApiApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 

      GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("json", "true", "application/json")); 
     } 
    } 
} 
+0

检查模型状态是否有任何错误。 –

+0

response = {StatusCode:500,ReasonPhrase:'内部服务器错误',... – BumbleBee

+0

对不起,我不是很清楚......你可以在动作开始时添加下面的代码来查看更详细的错误:'' if(!ModelState.IsValid) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest,this.ModelState)); }'...顺便说一句,在你的500以上的回复中,你是否看到任何错误信息? –

回答

3

您要发送一个字符串:

 var response = client.PostAsJsonAsync("http://localhost:52765/api/reports", criteria.Masnums.ToString()).Result; 

你的控制器方法期望StatsCriteria对象。将控制器方法的签名更改为接受字符串或更改后通话。 假设控制器方法签名是正确的职位应该是这样的:

 var response = client.PostAsJsonAsync("http://localhost:52765/api/reports", criteria).Result; 

如果这没有帮助我建议使用Fiddler检查邮件的外观,当你将它张贴等。