Asp.net core mvc 有条件地允许单击提交按钮
在表单中,我有一个字段,它应该采用文件名(在浏览文件之后)和按钮submit。单击“提交”后,应将文件加载到服务器。它工作正常。但如果我没有选择任何文件(例如,字段为空)-单击“导致异常”,因为没有要加载的内容 是的,大家好,mvc和web技术的新手 如何防止这种行为?例如,如何在单击sumbit后弹出“输入为空”的消息Asp.net core mvc 有条件地允许单击提交按钮,asp.net-core-mvc,Asp.net Core Mvc,在表单中,我有一个字段,它应该采用文件名(在浏览文件之后)和按钮submit。单击“提交”后,应将文件加载到服务器。它工作正常。但如果我没有选择任何文件(例如,字段为空)-单击“导致异常”,因为没有要加载的内容 是的,大家好,mvc和web技术的新手 如何防止这种行为?例如,如何在单击sumbit后弹出“输入为空”的消息 <form asp-action="Upload" asp-controller="Home" method="post" enctype="multipart/form
<form asp-action="Upload" asp-controller="Home" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-sm-7">
<label for="file">Xml file</label>
<div data-width="85%" class="input-group">
<label class="input-group-btn">
<span class="btn btn-primary">
<input id="file" name="Files" type="file" accept=".xml" style="display: none;">Browse…
</span>
</label>
<input type="text" class="form-control" readonly>
</div>
</div>
<div class="col-sm-1"></div>
<div class="col-sm-4" style="margin-top:15px;">
<input type="submit" class="btn btn-primary btn-block" value="Upload" />
</div>
</div>
Xml文件
浏览&hellip;
我会使用javascript和数据注释来解决这个问题,比如(用作方向):
还可以在viewmodel中使用数据注释。例如,如果使用[必需]
-属性,则在没有文件的情况下无法提交表单
看一看我认为公认的答案是懒惰和javascript漫游,并且一旦有超过1个输入字段,就会变得单调乏味 遵循代表模型-视图-控制器的MVC模式 您需要一个模型,该模型是从视图中收集的数据,然后在控制器中进行操作,在您的示例中,这是一个文件 因此,您的模型应该如下所示:
public class MyModelName {
[Required(ErrorMessage = "Display a custom error message when the field is not filled out, leave this option out for default error message")]
public IFormFile MyFileName { get; set; }
}
为了能够在视图中使用MyModelName
(我们称之为MyView
,它在控制器中获取并发布到MyView
操作),您必须让视图知道它。这是通过在视图文件的顶部包含@model MyModelName
来完成的(区分大小写)。当视图知道模型时,要引用它,请使用@model
,这将显示对象
现在,对于您的表单,使用asp helpers,而不是手动向输入字段添加属性,如name
和type
因此,不是:
这样写:
查看使用浏览器开发工具生成的内容,您将看到自动添加到输入字段的各种属性
页面上的任意位置为验证消息添加一个空格(通常位于输入字段下方):
此时,您可以通过调用ModelState.IsValid
使用服务器端验证,如下所示:
[HttpPost]
public IActionResult MyView(MyModelName model){
if(ModelState.IsValid)
//proceed to do whatever with the file
return View(model); //return the model with the validation errors
}
因此,服务器端验证意味着,在您可以在浏览器中看到错误消息之前,站点必须往返到后端
要在不访问服务器的情况下进行验证,可以在视图中包含部分验证脚本,该脚本由默认的Microsoft模板提供。在MyView.cshtml
include的底部(您需要默认的jquery库):
一旦进入这一阶段,您将进行客户端验证,除非满足所有验证要求,否则不会提交表单
如果要进一步操作验证,则在部分中添加的验证脚本将提供一个函数valid()
可以这样使用:
$('form').on('submit', function(e){
//stop the form from being submitted
e.preventDefault();
if($(this).valid()) {
//do stuff if form is valid
}
//do stuff if form is not valid
})
有关模型的更多信息您需要添加一些验证代码(如果愿意,可以在客户端和服务器中添加,但必须在服务器中添加),以便在处理模型中字段的值之前进行检查。这是一个相当标准的东西,您应该能够在线阅读它使用视图模型并添加
[必需]
属性到HttpPostedFileBase
属性,并使用HtmlHelper
方法对其进行强绑定,并实现mvc的客户端验证我回答说也应该使用数据注释-js方法仅通过禁用按钮向用户提供额外的视觉反馈。
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
$('form').on('submit', function(e){
//stop the form from being submitted
e.preventDefault();
if($(this).valid()) {
//do stuff if form is valid
}
//do stuff if form is not valid
})