仅在用户输入新数据时验证

时间:2019-05-05 09:32:44

标签: c# asp.net-core model-view-controller

我只想问一下是否可以在创建模式下验证特定数据,但不能在编辑模式下验证

模型

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类不需要?

感谢您的帮助。

2 个答案:

答案 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" />