"需要Id字段"创建的验证消息; 我未设置为[必需]

Dan*_*ann 69 asp.net-mvc data-annotations asp.net-mvc-2

当我尝试使用Asp.Net MVC 2中的创建样式操作创建实体时,会发生这种情况.

POCO具有以下特性:

public int Id {get;set;}

[Required]
public string Message {get; set}
Run Code Online (Sandbox Code Playgroud)

在创建实体时,会自动设置Id,因此在Create操作中不需要它.

ModelState表示"需要Id字段",但我没有将其设置为如此.这里有自动发生的事吗?

编辑 - 原因显示

Brad Wilson通过Paul Speranza在下面的一条评论中回答了这个问题的原因,他说(欢呼保罗):

你提供了身份证的价值,你只是不知道你是谁.它位于默认路由的路由数据中("{controller}/{action}/{id}"),其默认值为空字符串,对int无效.使用action参数的[Bind]属性排除ID.我的默认路由是:new {controller ="Customer",action ="Edit",id =""} //参数默认值

编辑 - 更新模型技术

我实际上通过使用TryUpdateModel和与之相关的exclude参数数组改变了我再次这样做的方式.

    [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);
    }
Run Code Online (Sandbox Code Playgroud)

Ros*_*ied 86

您可以添加属性:

 [Bind(Exclude = "Id")] 
Run Code Online (Sandbox Code Playgroud)

在方法而不是类中的参数上,在创建时,您可以排除它并在编辑时仍然是必需的:

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

public ActionResult Edit(User u)
{
    // will require for edit
}
Run Code Online (Sandbox Code Playgroud)

  • 那对我不起作用。我将其添加到操作中,但仍然收到错误。 (2认同)

Uli*_*ses 18

我遇到了这个问题,我在表单中动态地将"对象"添加到列表中.因此,我们的用户可以添加,删除或更新.除了创建新项目的情况外,这一切都运行良好.因此,在我的情况下,不包括Id属性.解决方案是使ID为Nullable:

public int? Id { get; set; }
Run Code Online (Sandbox Code Playgroud)

这样,现有项目将具有值,而新项目将具有null.好东西.


And*_*nea 11

很棒的问题和答案,拯救了我......落后.我需要添加一些东西:

代替

[Bind(Exclude = "Id")]
Run Code Online (Sandbox Code Playgroud)

我觉得最好用

[Bind(Include = "Prop1, Prop2, Prop3, etc")]
Run Code Online (Sandbox Code Playgroud)

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

由于这是白名单,而不是黑名单.白名单更好,更安全.这样您也可以解决过度发布和过度发布的风险.见Brad Wilson的帖子.


Bar*_*Alp 7

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

      [Required]
      public string Message {get; set}
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,它不会在创建时绑定模型的Id属性


小智 7

Id应该从客户端发送为0.模型没有Id = 0的问题,这是int的默认值.问题是他没有看到来自客户端的价值,或者是空间或空的.我有隐藏的输入表示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"/>
Run Code Online (Sandbox Code Playgroud)

此外,当我在客户端将表单添加到添加新实体时,我确保将隐藏的零初始化为零.

希望这有助于somone.

EFY