【发布时间】:2012-10-06 05:38:55
【问题描述】:
当我尝试通过 HTTP URL 发布订单时出现此错误
参数字典包含参数“id”的空条目 方法的不可空类型“System.Int32” 'DatabaseService_WebAPI.Models.Product GetProduct(Int32)' 在 'DatabaseService_WebAPI.Controllers.ProductController'。一个可选的 参数必须是引用类型、可为空的类型或声明为 一个可选参数。
我使用 ASP.NET Web API 上提供的教程制作我的 api 控制器。
这是我的网址
http://localhost:3325/api/Product/PostProduct?User=Haris2&ShopName=Dwatson&city=RYK&OrderDate=28/9/2012&OrderDetail=Strips
产品.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace DatabaseService_WebAPI.Models
{
public class Product
{
[ScaffoldColumn(false)]
public int Id { get; set; }
[Required]
public string User { get; set; }
public string ShopName { get; set; }
public string city { get; set; }
public string OrderDate { get; set; }
public string OrderDetail { get; set; }
}
}
ProductController.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using DatabaseService_WebAPI.Models;
namespace DatabaseService_WebAPI.Controllers
{
public class ProductController : ApiController
{
private ProductContext db = new ProductContext();
// GET api/Product
public IEnumerable<Product> GetProducts()
{
return db.Products.AsEnumerable();
}
// GET api/Product/5
public Product GetProduct(int id)
{
Product product = db.Products.Find(id);
if (product == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return product;
}
// PUT api/Product/5
public HttpResponseMessage PutProduct(int id, Product product)
{
if (ModelState.IsValid && id == product.Id)
{
db.Entry(product).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
// POST api/Product
public HttpResponseMessage PostProduct(Product product)
{
if (ModelState.IsValid)
{
db.Products.Add(product);
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, product);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = product.Id }));
return response;
}
else
{
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
}
// DELETE api/Product/5
public HttpResponseMessage DeleteProduct(int id)
{
Product product = db.Products.Find(id);
if (product == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
db.Products.Remove(product);
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
return Request.CreateResponse(HttpStatusCode.OK, product);
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}
RouteConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;
namespace DatabaseService_WebAPI
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
Global.asax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using DatabaseService_WebAPI.App_Start;
namespace DatabaseService_WebAPI
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
System.Data.Entity.Database.SetInitializer(new DatabaseService_WebAPI.Models.ProductContextInitializer());
// WebApiConfig.Configure(GlobalConfiguration.Configuration);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
是我的调用方法错误还是我必须做其他事情才能跳过id?
【问题讨论】:
-
你调用的是 api/Product/5 还是 api/Product ?如果是前者,那么所需的 id 显然是 null 所以错误是正确的
-
尝试将 public Product GetProduct(int id){} 更改为 public Product GetProduct(int?id){}
-
@MohsenAfshin i
ve called api/Product/PostProduct @MMK Im 没有得到产品。我正在尝试发布产品。 -
@Haris 错误的 url 架构!正确的是
api/Products并使用 HTTP POST 动词调用此类 URL。 -
调用 api/Product/PostProduct 最后不带 /id=5 会导致 id 变为 null
标签: c# asp.net-web-api