IFormFile 上的 C# Razor 页面必需属性仅在单击时有效
C# Razor page required attribute on IFormFile works only when clicking away
这里的目标是让 input="file"
Required
验证属性在点击之前起作用。现在,当我要上传 select 文件时,我必须单击才能要求验证才能工作。结果我必须双击提交。
index.cshtml.cs
[Required(ErrorMessage = "File is required.")]
[BindProperty]
[Display(Name = "File")]
public IFormFile Upload { get; set; }
index.cs
@page
@model IndexModel
@{
ViewData["Title"] = "Data uploader";
}
@if (Model.Success)
{
<div class="alert alert-success alert-dismissible">
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
Failas įkeltas.
</div>
}
@if (Model.Error)
{
<div class="alert alert-danger alert-dismissible">
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
@Model.ErrorMessage
</div>
}
<div class="panel-body py-4 bg-light">
<div class="container col-lg-8 floated_elements">
<div class="h4 text-center py-3">Data update</div>
<form method="post" class="needs-validation" enctype="multipart/form-data" novalidate>
<div class="form-group row mb-3">
<label asp-for="Upload" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<div class="custom-file">
<input type="file" asp-for="Upload" class="custom-file-input" accept=".zip" />
<label class="custom-file-label">Select file</label>
<span asp-validation-for="Upload"></span>
</div>
</div>
</div>
<button class="btn btn-primary float-right" type="submit">Submit</button>
</form>
</div>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script>
$(document).ready(function () {
if ($(".custom-file span").hasClass('field-validation-error')) {
if (!$(".custom-file-input").hasClass('is-invalid')) {
$(".custom-file-input").addClass("is-invalid")
}
}
}
);
window.setTimeout(function () {
$(".alert-success").fadeTo(500, 0).slideUp(500, function () {
$(this).remove();
});
}, 2000);
$(document).ready(function () {
$('.custom-file-input').on("change", function () {
var fileName = $(this).val().split("\").pop();
$(this).next('.custom-file-label').html(fileName);
});
});
</script>
}
单击 button
而不填充任何字段违反了模型上的 [Required]
属性。 ModelState
无效。显示验证错误消息以供查看。如果不提交,验证将无效。
- 解决方案 1
创建 client-side JavaScript 表单验证。
- 解决方案 2
对于您的情况,有一个简单的解决方案。添加 $("#update").click();
以触发验证。
Codes of Js
<script>
$(document).ready(function () {
$("#update").click();
if ($(".custom-file span").hasClass('field-validation-error')) {
if (!$(".custom-file-input").hasClass('is-invalid')) {
$(".custom-file-input").addClass("is-invalid")
}
}
}
为了更好的用户体验,我优化了输入change
事件的代码。
$('.custom-file-input').on("change", function () {
var fileName = $(this).val().split("\").pop();
$(this).next('.custom-file-label').html(fileName);
$(".custom-file-input").removeClass("is-invalid");
if (fileName == '')
$(".custom-file-input").addClass("is-invalid")
});
这里的目标是让 input="file"
Required
验证属性在点击之前起作用。现在,当我要上传 select 文件时,我必须单击才能要求验证才能工作。结果我必须双击提交。
index.cshtml.cs
[Required(ErrorMessage = "File is required.")]
[BindProperty]
[Display(Name = "File")]
public IFormFile Upload { get; set; }
index.cs
@page
@model IndexModel
@{
ViewData["Title"] = "Data uploader";
}
@if (Model.Success)
{
<div class="alert alert-success alert-dismissible">
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
Failas įkeltas.
</div>
}
@if (Model.Error)
{
<div class="alert alert-danger alert-dismissible">
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
@Model.ErrorMessage
</div>
}
<div class="panel-body py-4 bg-light">
<div class="container col-lg-8 floated_elements">
<div class="h4 text-center py-3">Data update</div>
<form method="post" class="needs-validation" enctype="multipart/form-data" novalidate>
<div class="form-group row mb-3">
<label asp-for="Upload" class="col-sm-2 col-form-label"></label>
<div class="col-sm-10">
<div class="custom-file">
<input type="file" asp-for="Upload" class="custom-file-input" accept=".zip" />
<label class="custom-file-label">Select file</label>
<span asp-validation-for="Upload"></span>
</div>
</div>
</div>
<button class="btn btn-primary float-right" type="submit">Submit</button>
</form>
</div>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
<script>
$(document).ready(function () {
if ($(".custom-file span").hasClass('field-validation-error')) {
if (!$(".custom-file-input").hasClass('is-invalid')) {
$(".custom-file-input").addClass("is-invalid")
}
}
}
);
window.setTimeout(function () {
$(".alert-success").fadeTo(500, 0).slideUp(500, function () {
$(this).remove();
});
}, 2000);
$(document).ready(function () {
$('.custom-file-input').on("change", function () {
var fileName = $(this).val().split("\").pop();
$(this).next('.custom-file-label').html(fileName);
});
});
</script>
}
单击 button
而不填充任何字段违反了模型上的 [Required]
属性。 ModelState
无效。显示验证错误消息以供查看。如果不提交,验证将无效。
- 解决方案 1
创建 client-side JavaScript 表单验证。
- 解决方案 2
对于您的情况,有一个简单的解决方案。添加 $("#update").click();
以触发验证。
Codes of Js
<script>
$(document).ready(function () {
$("#update").click();
if ($(".custom-file span").hasClass('field-validation-error')) {
if (!$(".custom-file-input").hasClass('is-invalid')) {
$(".custom-file-input").addClass("is-invalid")
}
}
}
为了更好的用户体验,我优化了输入change
事件的代码。
$('.custom-file-input').on("change", function () {
var fileName = $(this).val().split("\").pop();
$(this).next('.custom-file-label').html(fileName);
$(".custom-file-input").removeClass("is-invalid");
if (fileName == '')
$(".custom-file-input").addClass("is-invalid")
});