BumbleBee
BumbleBee

Reputation: 10779

webapi receiving null parameter

I'm attempting to POST an object to a WebAPI controller that accepts a complex type as the parameter but the parameter recived is null. Any ideas why? The request is hitting the WebAPI method properly and the parameter is null.

Model :

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

Here's the code at client : [ The StatsCriteria is part of the project BLL and I am referencing it in MASReports project]

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

Here's the signature for my controller in Webapi. [ The StatsCriteria is part of the project BLL and I have a reference to that project in ReportsAPI project] [ The CMAReportVM, CMAReport are part of the project BLL and I have a reference to BLL project in ReportsAPIproject]

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

// and here's my routing:

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

and here's my Golbal.asax of Web api

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

Upvotes: 3

Views: 1212

Answers (1)

Olav Nyb&#248;
Olav Nyb&#248;

Reputation: 11568

You are posting a string:

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

Your controller method expect a StatsCriteria object. Either change the signature of your controller method to accept a string or change the post call. Assuming that the controller method signature is correct the post should be something like this:

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

If this doesn't help I recommend to use fiddler to check what the message looks like when you post it.

Upvotes: 3

Related Questions