我有一个模型(简化)如下:
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
我目前正在尝试编写一个 Web API 应用程序,其中我想要验证的参数之一是查询参数(也就是说,我希望以表单形式传递它/route?offset=0&limit=100):
[HttpGet]
public async Task<HttpResponseMessage> GetItems(
int offset = 0,
int limit = 100)
{
if (!ModelState.IsValid)
{
// Handle error
}
// Handle request
}
Run Code Online (Sandbox Code Playgroud)
特别是,我想确保“offset”大于0,因为负数会导致数据库抛出异常。
我直接采用了附加 a 的逻辑方法ValidationAttribute:
[HttpGet]
public async Task<HttpResponseMessage> GetItems(
[Range(0, int.MaxValue)] int offset = 0,
int limit = 100)
{
if (!ModelState.IsValid)
{
// Handle error
}
// Handle request
}
Run Code Online (Sandbox Code Playgroud)
这根本不会导致任何错误。
在对 ASP.NET 进行了大量痛苦的调试之后,在我看来,这可能根本不可能。特别是,因为offset参数是方法参数而不是字段,所以ModelMetadata是使用GetMetadataForType而不是 来创建的GetMetadataForProperty,这意味着PropertyName将会是null …
我有一个控制器,我的 PUT 方法使用 multipart/form-data 作为内容类型,因此我在控制器内获取 JSON 和映射的类。
有没有一种方法可以根据我在控制器内部的模型类中编写的注释来验证该模型?
public class AbcController : ApiController
{
public HttpResponseMessage Put()
{
var fileForm = HttpContext.Current.Request.Form;
var fileKey = HttpContext.Current.Request.Form.Keys[0];
MyModel model = new MyModel();
string[] jsonformat = fileForm.GetValues(fileKey);
model = JsonConvert.DeserializeObject<MyModel>(jsonformat[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要验证控制器内的“模型”。仅供参考,我已向 MyModel() 添加了所需的注释。
我正在使用 ASP.NET Core MVC 2.0 实现一个 REST API 项目,如果模型绑定失败(因为请求语法错误),我想返回 400 状态代码,如果模型验证失败,我想返回 422 状态代码(因为该请求在语法上是正确的,但包含不可接受的值)。
例如,给定一个动作,如
[HttpPut("{id}")]
public async Task<IActionResult> UpdateAsync(
[FromRoute] int id,
[FromBody] ThingModel model)
Run Code Online (Sandbox Code Playgroud)
当id路由中的参数包含非数字字符或请求中未指定正文时,我想返回 400 状态代码,当属性ThingModel包含无效值时返回 422 状态代码。
从我所看到的情况来看,IValueProvider和IModelBinder实现都ModelStateDictionary像验证器一样将它们的错误添加到请求中,并且无法在绑定和验证之间注入代码。
我怎样才能实现这样的行为?
我真的很困惑.我在ASP.NET Core 2上有一个Razor页面,它具有一个必需的属性SchemaId.我试着将其标记为[Required],[BindRequired],和[Required(AllowEmptyStrings = false)],但是当我发表我的形式,我看到SchemaId的null,但ModelState.IsValid == true.这是Upload.cshtml.cs:
namespace Uploader.Pages
{
public class UploadModel : PageModel
{
private IUploader _uploader;
public UploadModel(IUploader uploader)
{
_uploader = uploader;
}
[BindProperty]
public IEnumerable<IFormFile> UploadedFiles { get; set; }
[Required(AllowEmptyStrings = false)]
[BindProperty]
[BindRequired]
public string SchemaId { get; set; }
public void OnGet(string schemaId = null)
{
SchemaId = schemaId;
}
public async Task<IActionResult> OnPostAsync()
{
// …Run Code Online (Sandbox Code Playgroud) 我正在将一些MVC代码移动到Web API,我需要更新我的自定义ModelValidatorProviders.好像我的验证器可以保持相同,只是它们应该继承System.Web.Http.Validation命名空间.
我无法弄清楚如何将提供程序添加到Web API.使用MVC时我可以将以下内容添加到我的global.asax中:
ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider());
Run Code Online (Sandbox Code Playgroud)
如何将自定义提供程序与Web API一起使用?
假设我有以下内容ViewModel:
public class PersonViewModel
{
[Required]
public String Email { get; set; }
[Required]
public String FirstName { get; set; }
[Required]
public String LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这ViewModel不是原创Entity,我在两个地方使用这个模型,在第一个我要验证所有字段,但在另一个我Email要从模型验证中排除字段.无论如何指定从验证中排除字段?
我通过使用针对FluentValidation的webapi集成包,设置了一个Web api项目以使用FluentValidation。然后,我创建了一个验证器,该验证器CustomAsync(...)用于对数据库运行查询。
问题在于,等待数据库任务时验证似乎陷入僵局。我进行了一些调查,看来MVC ModelState API是同步的,并且它调用Validate(...)使FluentValidation 调用的同步方法task.Result,从而导致死锁。
假设异步调用无法与Webapi集成验证一起使用是否正确?
如果是这样,还有什么选择?WebApi ActionFilters似乎支持异步处理。我是否需要构建自己的过滤器来手动处理验证,或者是否已经存在我没有看到的东西?
c# model-validation fluentvalidation async-await asp.net-web-api
嗨我在我的视图中有一个名为Description的文本区域字段.我希望增加该领域的规模.
我的代码
<div class="col-sm-3">
<div class="form-group">
<span style="color: #f00">*</span>
@Html.LabelFor(model => model.Description, new { @class = "control-label" })
@Html.TextAreaFor(model => model.Description, new { @class = "required", style = " rows=10, columns=40" })
@Html.ValidationMessageFor(model => model.Description)
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我的TextArea
我想带来如下图所示
所以我在textarea字段中给出了行和列.它增加了文本区域的大小.但是当我将页面缩小到手机大小意味着所有字段都缩小了.但是这个textarea字段不会缩小到页面大小.这是问题所在
我一直在验证我的领域.我想用红色显示验证.我正在使用模型验证.所以请任何人为这两个问题提供解决方案.
提前谢谢..
我已经开发了一个自定义验证器Attribute类,用于检查模型类中的Integer值。但问题是此类无法正常工作。我已经调试了我的代码,但是在调试代码期间没有遇到断点。这是我的代码:
public class ValidateIntegerValueAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
int output;
var isInteger = int.TryParse(value.ToString(), out output);
if (!isInteger)
{
return new ValidationResult("Must be a Integer number");
}
}
return ValidationResult.Success;
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个Filter类,用于在应用程序请求管道中全局进行模型验证。这是我的代码:
public class MyModelValidatorFilter: IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
if (context.ModelState.IsValid)
return;
var errors = new Dictionary<string, string[]>();
foreach (var err in actionContext.ModelState)
{
var itemErrors = new List<string>();
foreach (var error in err.Value.Errors){ …Run Code Online (Sandbox Code Playgroud) model-validation ×10
c# ×7
asp.net-mvc ×3
asp.net ×1
asp.net-core ×1
async-await ×1
html ×1
razor ×1
validation ×1