我的问题很有希望.提交表单后,我想将包含无效字符(特别是HTML)的所有属性(字段)标记为模型错误.我面临的问题是请求验证在模型绑定/验证之前启动并且我获得了HTTP 500 ...我看到了一个类似的问题,它[AllowHtml]在Model/ViewModel上使用属性属性或<httpRuntime requestValidationMode="2.0" />在web.config中使用属性属性 ,但是我在我正在寻找的是如何" 全局捕获请求验证异常并将其显示为模型错误 ".此外,我不想"剥离"HTML标签,我想通知用户他们的输入无效.
我想过使用正则表达式验证属性来查找错误的输入,但正如我所提到的,ASP.NET MVC3上的请求验证发生在模型绑定/验证之前,所以这是不行的...
我正在使用ASP.NET Core 2.0默认模型验证,ModelState.IsValid尽管模型中存在错误数据,但似乎无法使用始终为真.
[HttpPost("abc")]
public async Task<IActionResult> Abc([FromBody]AbcViewModel model)
{
if (!ModelState.IsValid) { return BadRequest(ModelState); }
...
}
public class AbcViewModel
{
[Required(ErrorMessage = "Id is required")]
[Range(100, int.MaxValue, ErrorMessage = "Invalid Id")]
public int Id { get; set; }
public bool Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我从Angular应用程序发布数据时,值正确映射到模型,但如果Id为"0"或小于100,则验证器Required和Range验证器都不起作用且ModelState.IsValid始终为true.我错过了什么?
我在我的WebApi项目控制器中成功实现了FluentValidation,该控制器只有一个HttpGet方法.当我添加另一个HttpGet方法时,我将路由属性添加到两个方法中.即[Route("Method1")]和[Route("Method2")].
现在无论我是否输入任何数据,ModelState都会返回true.
这是我的代码.
WebApiConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Filters.Add(new ValidateModelStateFilter());
//FluentValidation
FluentValidationModelValidatorProvider.Configure(config);
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{action}/{id}",
defaults: new { controller = "Menu", id = RouteParameter.Optional}
);
}
}
Run Code Online (Sandbox Code Playgroud)
ValidateModelStateFilter
public class ValidateModelStateFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (!actionContext.ModelState.IsValid)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
Run Code Online (Sandbox Code Playgroud)
调节器
[HttpGet]
[Route("Method1")]
public IHttpActionResult ReadAllMenusByApplication([FromUri] ReadAllMenusByApplicationInput input)
{
var result = new List<ApplicationMenu>();
...
} …Run Code Online (Sandbox Code Playgroud) 我正在一个页面上,用户需要填写一些信息,最后选择一个或多个带有复选框的客户.
客户列表是IEnumerable<Customer>我传递给我的模型的.我将如何使用创建复选框列表.CheckBoxFor()?
最后,我希望能够验证是否已选择至少1个复选框.
请求是保存用户输入的信息的对象.
<% foreach (var customer in Model.Request.Customers) { %>
<%= Html.CheckBoxFor(/* customer */) %>
<% } %>
Run Code Online (Sandbox Code Playgroud)
谁能指出我正确的方向?或者我这样做是错的?
请参阅下面的代码.基本上,当用户创建此类的对象时,他们需要指定value_type.如果value_type==2(百分比),则percentage_calculated_on(表单/模板一侧的CheckboxSelectMultiple需要检查一个或多个项目.模型验证不允许我像我正在尝试验证 - 它基本上抛出一个异常,告诉我实例在使用多对多关系之前需要有一个主键值.但是我需要先保存它之前验证对象.我已经在表单(modelform)端尝试了这个验证(使用表格的清洁方法),但同样的事情也发生在那里.
我如何实现此验证?
INHERENT_TYPE_CHOICES = ((1, 'Payable'), (2, 'Deductible'))
VALUE_TYPE_CHOICES = ((1, 'Amount'), (2, 'Percentage'))
class Payable(models.Model):
name = models.CharField()
short_name = models.CharField()
inherent_type = models.PositiveSmallIntegerField(choices=INHERENT_TYPE_CHOICES)
value = models.DecimalField(max_digits=12,decimal_places=2)
value_type = models.PositiveSmallIntegerField(choices=VALUE_TYPE_CHOICES)
percentage_calculated_on = models.ManyToManyField('self', symmetrical=False)
def clean(self):
from django.core.exceptions import ValidationError
if self.value_type == 2 and not self.percentage_calculated_on:
raise ValidationError("If this is a percentage, please specify on what payables/deductibles this percentage should be calculated on.")
Run Code Online (Sandbox Code Playgroud) 使用ASP.NET MVC,我有一个模型,我附加属性,以便我可以使用MVC模型绑定验证,但这不会打破MVC的规则,你放置属于的项目视图,进入模型?我希望我不是为了变得聪明,但我对其他人的意见感到好奇.
public class Payments
{
[DataType(DataType.Text)]
[DisplayFormat(NullDisplayText="")]
[Display(Name="Payment Id")]
[Required(ErrorMessage="Required")]
public int PaymentId { get; set; } //todo: make this into a dropdown
[DataType(DataType.Text)]
[Display(Name="Bill Name")]
[Required(ErrorMessage = "Required")]
public string PaymentName { get; set; }
[DataType(DataType.Date)]
[Display(Name="Date to Post Payment")]
[Required(ErrorMessage = "Required")]
public DateTime PaymentDate { get; set; }
[DataType(DataType.Currency)]
[Range(0, 922337203685477.5807)]
[Required(ErrorMessage = "Required")]
public double PaymentAmount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我发现了许多simulair问题,但不是一个有效的干净解决方案.我看到很多自定义代码可以让它工作,但为什么会这样?这应该从一开始就不起作用吗?
我认为奇怪的是,在IE9中它可以工作,但在Firefox和Chrome中它失败了.每当我在Firefox或Chrome中尝试时,我都会收到消息"字段生日必须是日期".
当我在新的MVC 4 RTM项目中尝试下面的代码时,我无法让它工作.我在所有浏览器中都看到DateTime.Now默认为dd-MM-yyyy(Holland)但我无法在Firefox和Chrome中提交它.
全局标记未在web.config中设置,因此必须使用默认值.我来自荷兰,所以它应该得到我猜的客户文化.
public class RegisterModel
{
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
//[DataType(DataType.Date)]
public DateTime Birthday { get; set; }
}
[AllowAnonymous]
public ActionResult Register()
{
RegisterModel vm = new RegisterModel()
{
Birthday = DateTime.Now
};
return View(vm);
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
//WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
//WebSecurity.Login(model.UserName, model.Password);
return …Run Code Online (Sandbox Code Playgroud) validation asp.net-mvc model-validation asp.net-mvc-3 asp.net-mvc-4
我正在研究一个在mvc 4上编写的项目,该项目有几个类似向导的行为实例 - 几个视图链通过相同的半填充模型.从第二个视图控件开始最初显示为无效(这是逻辑 - 模型,传递给控制器方法具有相应的属性为空).目前
ModelState.Clear();
使用的是解决方案,但是将模型作为参数放入每个方法看起来很难看.与此处的方法相同,在Asp.Net MVC中禁用模型验证
ModelBinders.Binders[typeof(MyModelType)] = new NonValidatingModelBinder();
Run Code Online (Sandbox Code Playgroud)
项目有太多(超过100个)模型类来手动注册每个模型类.
是否有更简单的方法(也许键入.config)完全关闭模型验证?
我有一个View (Index.cshtml)它有两个模态(Bootstrap模态).
我有一个装Partial View在每个modal.所以在这里View,我有两个Partial Views(AddContractHistory.cshtml和AddCompany.cshtml).
我有一个模型,它的字段应该在每个中验证Partial Views.我需要分别验证每个部分视图.
在相同的其他问题,Html.BeginForm被使用,但我对工作MVC模块和DNN 8是Html.BeginForm或Ajax.Html.BeginForm不被支持.
为了完成这项工作而没有BeginForm,我测试了许多方法,如下面但我不能正确地做到这一点.
Index.cshtml(查看)
@using MyProject.BusinessLogic
<div class="form-group">
<div class="col-sm-12">
<button type="button" class="btn btn-success" onclick="$('#AddContractHistory').modal('show');">
<i class="fa fa-plus"></i>
New ContractHistory
</button>
</div>
<div class="col-sm-12">
<button type="button" class="btn btn-success" onclick="$('#AddCompany').modal('show');">
<i class="fa fa-plus"></i>
New Company
</button>
</div>
</div>
<div id="AddContractHistory" class="modal fade" …Run Code Online (Sandbox Code Playgroud) 我有一个模型(简化)如下:
public UserModel {
...
public USState State {get; set; }
public string StateString {get; set; }
public Country Country {get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
我需要的验证规则是:
Country是美国,则State需要。Country不是美国,则StateString需要。我创建了一个自定义验证属性RequiredIfAttribute。这很好用,所以我不打算用它的实现来回答这个问题。它有三个必需的成员:
CompareField - 这是用于检查是否需要验证的字段。 CompareValue - 这是它将用来比较以决定是否需要验证的值。CompareType - 这就是它如何比较值来决定是否需要验证。所以有了这个,我更新了我的模型:
public UserModel {
...
[RequiredIf("Country", Country.USA, EqualityType.Equals)]
public USState State {get; set; }
[RequiredIf("Country", Country.USA, EqualityType.NotEquals)]
public string StateString {get; set; }
[Required]
public Country Country {get; …Run Code Online (Sandbox Code Playgroud) validation asp.net-mvc model-binding model-validation asp.net-mvc-4
model-validation ×10
asp.net-mvc ×6
c# ×4
validation ×4
asp.net ×1
asp.net-core ×1
django ×1
dotnetnuke ×1
jquery ×1
model ×1
view ×1