C# 字典包含不可为空类型“System.Int32”的参数“id”的空条目
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12909319/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32'
提问by Haris
I`m getting this error when i try to post some order through HTTP URL
当我尝试通过 HTTP URL 发布一些订单时出现此错误
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'DatabaseService_WebAPI.Models.Product GetProduct(Int32)' in 'DatabaseService_WebAPI.Controllers.ProductController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
对于“DatabaseService_WebAPI.Controllers.ProductController”中的方法“DatabaseService_WebAPI.Models.Product GetProduct(Int32)”的不可为空类型“System.Int32”的参数“id”,参数字典包含一个空条目。可选参数必须是引用类型、可为空类型或声明为可选参数。
i make my api controller by using a tutorial which is availabe on ASP.NET Web API.
我使用 ASP.NET Web API 上提供的教程制作了我的 api 控制器。
This is my URL
这是我的网址
http://localhost:3325/api/Product/PostProduct?User=Haris2&ShopName=Dwatson&city=RYK&OrderDate=28/9/2012&OrderDetail=Strips
Product.cs
产品.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
产品控制器.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
全球.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);
}
}
}
}
Is my calling method is wrong or i have to do something else for to skip id?
我的调用方法是错误的还是我必须做其他事情才能跳过 id?
采纳答案by Maggie Ying
Two things:
两件事情:
You need [FromUri] on your Product parameter if you want to pass this complex type from the Url:
// POST api/Product public HttpResponseMessage PostProduct(Product product) {...}You need to add a Http route that accepts the action name in the Uri (since your uri you provided has "PostProduct" in it...)
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
如果要从 Url 传递此复杂类型,则需要在 Product 参数上使用 [FromUri]:
// POST api/Product public HttpResponseMessage PostProduct(Product product) {...}您需要添加一个 Http 路由来接受 Uri 中的操作名称(因为您提供的 uri 中包含“PostProduct”...)
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
回答by Mark Jones
Try adding the following attribute [FromUri]to your POST method:
尝试将以下属性添加[FromUri]到您的 POST 方法中:
// POST api/Product
public HttpResponseMessage PostProduct([FromUri]Product product)
{
Your relative URL should be
你的相对 URL 应该是
http://localhost:xxxx/api/Product
This should allow you to POST your model using this URL:
这应该允许您使用此 URL 发布您的模型:
http://localhost:xxxx/api/Product?User=Haris2&ShopName=Dwatson&city=RYK&OrderDate=28/9/2012&OrderDetail=Strips
Also consider using a JSON [FromBody]payload instead:
还可以考虑使用 JSON[FromBody]负载:
// POST api/Product
public HttpResponseMessage PostProduct([FromBody]Product product)
{
With request like:
请求如下:
User-Agent: Fiddler
Host: localhost:55805
Content-Length: 98
Content-Type: application/json
POST: http://localhost:xxxx/api/product
BODY: {"User":"Haris2","ShopName":"Dwatson","city":"RYK","OrderDate":"28/9/2012","OrderDetail":"Strips"}
回答by mmh
you must add form method in the action link
您必须在操作链接中添加表单方法
@Html.ActionLink("??? ????????", "JobDetails","Job", new { id = item.UniqueId },***FormMethod.Get or post***)

