我只想问一下是否可以在创建模式下验证特定数据,但不能在编辑模式下验证
。模型
public class FileModel
{
......
[Required(ErrorMessage = "You didn't select a file to upload")]
public IFormFile FileAttachment { get; set; }
}
CONTROLLER
[HttpPost]
public async Task<IActionResult> Edit(FileModel file)
if (ModelState.IsValid)
{
.....
}
查看
@{ if (Model.FileID == 0)
{
<p>Upload new file with this button:</p>
<input type="file" asp-for="FileAttachment">
<span asp-validation-for="FileAttachment" class="text-danger"></span>
}
}
基本上,如果它是新模型(FileID == 0),我希望用户选择文件。 但是如果用户正在编辑所选文件。我不想他再次加载文件。
但是,即使我隐藏在View中,以上代码仍无法使用Model.State失败。
当文件ID为0时,如何告诉Model类不需要?
感谢您的帮助。
答案 0 :(得分:1)
我正在编辑模型中的其他属性,因此可以仅为涉及的属性创建视图模型。如果要编辑文件,则也应将其发送到操作。如果文件无法编辑,则可以在model.state检查之前检查是否为空
答案 1 :(得分:1)
在.NET Core中,您可以简单地创建一个从ValidationAttribute
继承的类。您可以在this doc中看到全部详细信息。
根据您的要求,您可以创建以下属性:
public class FileAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
FileModel fileModel = (FileModel)validationContext.ObjectInstance;
if (fileModel.FileID ==0)
{
return new ValidationResult(GetErrorMessage());
}
return ValidationResult.Success;
}
public string GetErrorMessage()
{
return "You didn't select a file to upload";
}
}
和使用方式一样:
[FileAttribute]
public IFormFile FileAttachment { get; set; }
也不要忘记在表单中包含FileID
,以便该属性可以在表单发布后获取值:
<input type="hidden" asp-for="FileID" />