当我尝试使用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) 我有这个字段,由于某种原因,当我点击提交时,获得一个验证消息,该字段是必需的.
[DisplayName("Total Budget:")]
public double Budget { get; set; }
@Html.EditorFor(model => model.account.Budget)
@Html.ValidationMessageFor(model => model.account.Budget)
public class Account
{
[DisplayName("Total Budget:")]
public double Budget { get; set; } //dropdown
}
Run Code Online (Sandbox Code Playgroud) 我上课了.有一次,我使用System.ComponentModel将类的属性设置为[Required] ....
好的,然后我意识到这不是必需的.我已经删除了所需的属性,但是当我尝试将表单提交给ActionResult时,表单不会发布,并且仍在尝试强制要填充TextBoxFor(theModelProperty).
我删除了"obj"文件夹,"bin"文件夹,还"清除"了解决方案.仍然没有决议.
我不想做一个愚蠢的解决方法,我想做正确的事情.知道为什么会这样吗?
asp.net-mvc componentmodel required data-annotations asp.net-mvc-3
标准输出@Html.HiddenFor(model => model.Id)是
<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="0" />
Run Code Online (Sandbox Code Playgroud)
是否需要生成data-val-*属性?它们看起来相当冗长,并且不需要能够存储和返回下一个POST的数据.
禁用这些属性是个好主意吗?它们对某些场景有用吗?
ps:目前我有办法通过临时设置禁用它们 ViewContext.UnobtrusiveJavaScriptEnabled = false
使用这两个类:
public static class Extensions
{
public static NoUnobtrusiveJavaScript NoUnobtrusiveJavaScript(this HtmlHelper htmlHelper)
{
return new NoUnobtrusiveJavaScript(htmlHelper.ViewContext);
}
}
public class NoUnobtrusiveJavaScript: IDisposable
{
private bool _disposed;
private readonly bool _unobtrusiveJavaScript;
private readonly ViewContext _viewContext;
public NoUnobtrusiveJavaScript(ViewContext viewContext)
{
if (viewContext == null) {
throw new ArgumentNullException("viewContext");
}
_viewContext …Run Code Online (Sandbox Code Playgroud) 我有一个int?查看在客户端验证的模型属性,就像它是必需的一样.也就是说,如果我将该字段留空,则不会提交.字符串属性不会发生同样的情况.
为我的编辑器呈现的HTML是:
<input type="text" value="" name="StatusIdSearch" id="StatusIdSearch" data-val-number="The field Status must be a number." data-val="true" class="text-box single-line">
Run Code Online (Sandbox Code Playgroud)
我认为这data-val-number会导致错误,因为没有什么不是数字,但我无法确定原因.
有任何想法吗?
编辑
视图模型:
public class CompromissoSearchModel
{
// other properties removed for the sake of clarity
[Display(Name = "Status")]
[EnumDataType(typeof(StatusCompromisso))]
public int? StatusIdSearch { get; set; }
// other properties removed for the sake of clarity
}
Run Code Online (Sandbox Code Playgroud) 我的模特
[DataType(DataType.Text)]
[Display(Name = "Number of Employee")]
public int NumberOfEmployee { get; set; }
[DataType(DataType.Date)]
[Display(Name = "CEO Birthday")]
[DateRange(2)]
public DateTime CEO_Birthday { get; set; }
[DataType(DataType.Date)]
[Display(Name = "Organisation Anniversary")]
[DateRange(3)]
public DateTime OrgAnniversary { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的观点
<tr>
<td style="border:0;">
<div class="editor-label">
@Html.LabelFor(m => m.NumberOfEmployee)
</div>
</td>
<td style="border:0;">
<div class="editor-field">
@Html.TextBoxFor(m => m.NumberOfEmployee)
</div>
</td>
</tr>
<tr>
<td style="border:0;vertical-align:middle;">
<div class="editor-label">
@Html.LabelFor(m => m.CEO_Birthday)
</div>
</td>
<td style="border:0;">
<div class="editor-field">
@Html.TextBoxFor(m => m.CEO_Birthday, …Run Code Online (Sandbox Code Playgroud) 这是类代码检查,没有DataAnnotation.
public int Rotate { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是它的用途
@Html.HiddenFor(model => model.Screen.Rotate)
Run Code Online (Sandbox Code Playgroud)
这里生成html,y生成验证规则????
<input type="hidden" value="" name="Screen.Rotate" id="Screen_Rotate" data-val-required="The Rotate field is required." data-val-number="The field Rotate must be a number." data-val="true">
Run Code Online (Sandbox Code Playgroud)
注意:如果我将int Rotate更改为string Rotate,那么它不会为data-val-required,data-val-number等验证生成额外的属性.
我有一个像这样的模特
public int Id {get;set;}
[Required]
public string FirstName{get; set}
[Required]
public string LastName{get; set}
Run Code Online (Sandbox Code Playgroud)
Id在DB中自动生成.当我想要调用Create Action时ModelState说"需要Id字段"!!!! 我找到了这个问题,但它不是干净的解决方案.还有其他方法可以解决这个问题吗?
有没有办法改变值类型的Mvc ModelBinder行为?