Create; Id 上的验证消息“ The Id field is need”没有设置为[ Refied ]

当我尝试使用 Asp.NetMVC2中的 Create 样式操作创建实体时,就会发生这种情况。

POCO 具有以下特性:

public int Id {get;set;}


[Required]
public string Message {get; set}

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

ModelState 说“ Id 字段是必需的”,但是我还没有设置为这样。 是不是有什么自然而然的事情发生了?

编辑-揭示原因

布拉德 · 威尔逊(Brad Wilson)通过保罗 · 斯佩兰萨(Paul Speranza)在下面的评论中回答了这个问题,他说(为保罗欢呼) :

你提供的价值 身份证,你只是不知道你是。 它在默认的路由数据中 路由(“{ controller }/{ action }/{ id }”) , 其默认值为空 字符串,对于 int 无效。 使用[ Bind ]属性 动作参数排除 ID 默认路由为: new { controller = “ Customer”,action = “ Edit”,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);
}
59224 次浏览
[Bind(Exclude = "Id")]
public class Hebe
{
public int Id {get;set;}


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

通过上面的方式,它不会在创建时绑定模型的 Id 属性

可以添加属性:

 [Bind(Exclude = "Id")]

在方法中的参数而不是类中,这样在创建时你可以排除它,在编辑时它仍然是强制的:

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


public ActionResult Edit(User u)
{
// will require for edit
}

我刚刚创建了一个新的 MVC2项目,并添加了一个简单的 POCO 以及控制器和视图。据我所知,您正在使用模型绑定来创建对象,也就是说

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 应该设置为 default (int) ,即0。这对我有用。您使用的是哪个版本的 MVC2(我假设是 RC) ?

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

我也有同样的问题,使用 RC2和 POCO。如果您命名了一个属性 Id,但没有在其上放置验证属性,但 IsValid 说它是必需的。如果我将属性命名为除 Id 以外的任何名称,则不会发生这种情况。我为什么要排除身份证?

谢谢

我也有同样的问题,只不过我的模型上有三个整数字段。我设法通过将所有错误地需要为 nullable int 的整数属性设置为 nullable int 来绕过它。

问得好,解决了我的问题,不过我得补充一点:

而不是

[Bind(Exclude = "Id")]

我觉得最好用

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

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

因为这是白名单,而不是黑名单。白名单更好,更安全。这样你也解决了过度张贴和过度张贴的风险。参见 Brad Wilson 的帖子

加? 到 int

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

我在一个表单中遇到了这个问题,我在这个表单中动态地向列表中添加“对象”。因此,我们的用户可以添加、删除或更新。除了创建新项的情况之外,它都工作得很好。因此,在我的案例中,排除 Id 属性不是一个选项。返回文章页面

public int? Id { get; set; }

这样现有的条目将有一个值,而新的条目将有空值。

在我的例子中,问题来自于 ID 是 string类型的事实。改为 int(不为空)为我修复它。string类型是逆向工程设计糟糕的数据库的结果。

以上答案是正确的。任何一个如何每一个遵循不同的情况。我的解决方案是如下同样的问题。 如果您的 ID 是一个主键,那么您需要启动它,我的意思是说,当您传递模型到视图在获取方法只是创建新的对象之前。它将把您的 ID 设置为0而不是 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)

这样我就不必显式地指定 Bind 属性

客户端应该将 Id 作为0发送。 该模型在 Id = 0时没有问题,这是 int 的默认值。 问题在于他没有看到来自客户端的值,或者来自空格或 null。 我有一个表示 Id 的隐藏输入(或者在复杂对象 nestedPropertyId/ nestedproperty.Id 中) ,所以我确保它以0开始。

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

此外,当我重置窗体添加新的客户端实体,我确保初始化隐藏与零。

希望这对谁有帮助。

伊菲

检查你的视图。如果你有 iddenfieldforid 字段,请删除。这只用于编辑。 @ Html. HiddenFor (Model = > Model.Id)

我和你也有同样的问题,现在我已经解决了。 使用 HttpGet,您需要返回一个视图将空的模型

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

希望对你有用。

您可以通过在 DataAnnotationsModelValidatorProvider上设置 AddImplicitRequiredAttributeForValueTypes选项来禁用这种隐式验证,方法是在 Application_Start中添加以下内容:

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

进一步阅读 :

在检查 ModelState.IsValid 之前,从 ModelState 中删除‘ Id’。

ModelState.Remove("Id");