webapi接收空参数

时间:2013-11-04 19:19:05

标签: asp.net-mvc-4 asp.net-web-api

我正在尝试将对象发布到WebAPI控制器,该控制器接受复杂类型作为参数,但recived参数为null。有什么想法吗?请求正确地访问WebAPI方法,参数为null。

型号:

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

1 个答案:

答案 0 :(得分: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检查发布时的消息。