“创build时需要Id字段”validation消息; Id未设置为

当我尝试在Asp.Net MVC 2中使用创build样式操作创build实体时发生这种情况。

POCO具有以下属性:

public int Id {get;set;} [Required] public string Message {get; set} 

在创build实体时,Id被自动设置,所以在Create操作中不需要它。

模型状态说“Id字段是必需的”,但是我没有设置那样。 有什么东西在这里自动发生?

编辑 – 显示的原因

Brad Wilson通过Paul Speranza回答了这个问题,他在下面的一段评论中回答说:(干杯保罗):

你提供了一个ID的价值,你只是不知道你是。 它在默认路由(“{controller} / {action} / {id}”)的路由数据中,其默认值是空string,对int无效。 使用action参数的[Bind]属性来排除ID。 我的默认路由是:新{控制器=“客户”,行动=“编辑”,ID =“”} / /参数的默认值

编辑 – 更新模型技术

我实际上改变了我通过使用TryUpdateModel和与之配合的排除参数数组的方式。

  [HttpPost] public ActionResult Add(Venue collection) { Venue venue = new Venue(); if (TryUpdateModel(venue, null, null, new[] { "Id" })) { _service.Add(venue); return RedirectToAction("Index", "Manage"); } return View(collection); } 

您可以添加属性:

  [Bind(Exclude = "Id")] 

在方法中的参数而不是类,这种方式创build你可以排除它,并在编辑它仍然是强制性的:

 public ActionResult Create([Bind(Exclude = "Id")] User u) { // will exclude for create } public ActionResult Edit(User u) { // will require for edit } 

我遇到了这个问题,我在其中dynamic添加“对象”列表。 因此,我们的用户能够添加,删除或更新。 除了创build新项目的情况之外,这一切都运行良好。 出于这个原因,在我的情况下, 排除Id属性不是一个选项解决scheme是使ID为可空

 public int? Id { get; set; } 

这样现有的项目将有一个值,新的将具有空值。 好东西。

伟大的问题和答案,拯救了我的背后。 但是我需要添加一些东西:

代替

 [Bind(Exclude = "Id")] 

我觉得使用更好

 [Bind(Include = "Prop1, Prop2, Prop3, etc")] 

..其中Prop1,Prop2和Prop3是您想要在操作级别绑定的唯一属性。

由于这是白名单,而不是黑名单。 白名单更好,更安全。 这样你也可以解决发贴过多的风险。 见Brad Wilson的post 。

 [Bind(Exclude = "Id")] public class Hebe { public int Id {get;set;} [Required] public string Message {get; set} } 

顺便说一下,它不会绑定您的模型创build的Id属性

我有同样的问题,使用RC2与POCO。 如果您命名一个属性Id,但不要在其上放置validation属性,但IsValid表示它是必需的。 如果我命名一个属性,但是Id不会发生。 为什么我必须排除ID?

谢谢

添加? 整数

 [Key] [HiddenInput(DisplayValue = false)] public int? ID { get; set; } 

Id应该从客户端发送为0.模型没有Id = 0的问题,这是int的默认值。 问题是,他没有看到来自客户端的价值,或者它与空间或null来。 我有一个input隐藏代表Id(或在复杂的对象NestedPropertyId / NestedProperty.Id),所以我确保它的值为零开始。

 <input type="hidden" id="id" value="0" /> <input type="hidden" id="eventId" value="0"/> <input type="hidden" id="contactId" value="0"/> 

另外当Ireset窗体添加新的实体在客户端,我确保初始化隐藏零。

希望这有助于somone。

EFY

在我的情况下,问题来自ID是一个stringtypes的事实。 更改为一个int (不可为空)为我修复。 stringtypes是逆向工程devise糟糕的数据库的结果。

检查你的看法。 如果您的隐藏字段为id,请删除。 这仅用于编辑。 @ Html.HiddenFor(Model => Model.Id)

我刚刚创build了一个新的MVC2项目,并添加了一个简单的POCO以及一个Controller和一个View。 据我所知,你使用模型绑定来创build对象,也就是说

 using System.ComponentModel.DataAnnotations; public class SimpleObject { public int Id {get;set;} [Required] public string Message { get; set; } } 

在我们的控制器

 [HttpPost] public ActionResult Create(SimpleObject created) { /// do something } 

而在视图中,ID字段没有编辑器?

这不应该在任何错误信息。 相反,Id应该被设置为默认(int),它是0.这对我很有用。 你使用的是什么版本的MVC2(RC我认为)?

不要误解我的意思:防止Id被模型绑定器束缚是非常重要的,因为这会使攻击者篡改对象的Id。 尽pipe如此,默认的模型联编程序不应该显示您描述的行为。

我有同样的问题,除了我的模型上有三个整数字段。 我设法通过设置所有我的整数属性是错误的要求可空的整数。

以上答案是正确的。 任何一个如何遵循不同的情况。对于同样的问题,我的解决scheme如下。 如果你的ID是一个主键,那么你需要启动它,我的意思是说,当你传递模型来查看get方法只是在它之前创build新的对象。 它会将0设置为您的ID而不是null。

我有同样的问题,并设法解决它通过在Create方法的GET调用期间简单地传递视图模型的空实例到视图。

 //GET: DocumentTypes/{Controller}/Create public ActionResult Create() { return View(new DocumentTypeViewModel()); } //POST: DocumentTypes/{Controller}/Create [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(DocumentTypeViewModel viewModel) { if(ModelState.IsValid) { var result = AddDocumentType(viewModel); if(!result.HasValidationErrors) { return RedirectToAction("Index"); } ModelState.Update(result); } return View(viewModel); } 

然后在我看来,我确保我有

 @Html.HiddenFor(m => m.ID) 

这样我不必显式指定绑定属性

我也面临同样的问题,现在我已经解决了这个问题。 用HttpGet你需要返回一个View将空的模型。 如

 [HttpGet] public ActionResult Add() { //Your code here return View(new Venue); } 

我希望这对你有用。