c# - 上传文件时如何处理服务器端的验证错误
问题描述
我有一个经过服务器端验证的表单,如果表单包含无效项目,则模型将返回到视图,然后 JavaScript 会突出显示无效的字段。这是一个包含用于文件上传的输入类型文件的多部分表单。我正在使用 Visual Studio 2017、ASP.Net Core 2.1 和 ASP.Net MVC 设计模式。
问题:用户提交表单并附加了一个文件,但由于一个或多个输入字段,表单无效。当通过验证错误将模型传递回视图时,该文件不再附加,因为您无法从服务器填充输入类型文件(至少我不知道,认为这是一项安全功能)。
期望行为:用户不必重新选择输入中的文件以进行第二次上传。
当前解决方案:我在服务器上的 Session 中序列化并保存上传的文件,然后在模型上设置一个属性,告诉视图文件保存在会话中并删除输入类型文件以进行上传,然后重新提交,如果表单是有效的,从 Session 中反序列化文件,对文件做我需要做的事情,然后从 Session 中删除它。
问题:有没有更好的方法来处理这个问题?如果是这样,请提供示例文档或建议。
解决方案
我不确定你正在做的验证,但它可以移动到前端吗?通常,前端的验证更多的是为了用户体验。(例如,格式不正确、字段留空、字段中的数据类型不正确)。如果是这种情况,我会将其移至前端,否则您可以将其留在后端。
当它们离开焦点时,您可以使用 AJAX 验证表单中的字段。这样可以保证当他们提交表单时,表单中的字段总是正确的。我发现前端和服务器端验证的健康组合效果最好,并且后端没有所有内容。
onblur
下面的粗略示例在方法触发时向控制器发送 ajax 请求以验证输入字段。如果它通过验证,它会将边框设置为绿色或红色,如果有要显示的消息,它将显示一条消息。只需确保您的模型与您将在请求中发送的内容相匹配:
JS:
<script>
function validate() {
var input = { input: $('#one').val() };
$.ajax({
url: 'ValidateTextBox/',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(input),
success: function (data) {
if (JSON.parse(data.Result)) {
$('#one').css('border', '5px solid green');
} else {
$('#one').css('border', '5px solid red');
}
$('#result').text(data.Message);
}
})
}
</script>
<input id="one" type="text" onblur="validate()"/>
<label id="result"></label>
控制器.cs
[HttpPost]
public ActionResult ValidateTextBox(Dummy data)
{
int result = 0;
if (!int.TryParse(data.input, out result)) {
return Json(new { Result = false, Message = "Please enter in numbers" });
}
return Json(new { Result = true, Message = "Success" });
}
模型.cs
public class Dummy
{
public string input { get; set; }
}
推荐阅读
- linux - 是否可以记录整个脚本?
- google-app-engine - 使用自定义运行时修改 Google Cloud App Engine 柔性环境上的 Nginx 配置
- u-sql - U-sql ocrextractor 不工作
- c# - 我可以使用适配器设计模式来简化接口列表吗?
- python - Pandas - 根据百分比获取前 n 行
- wordpress-theming - 使用 Timber 时推荐使用的文件夹和文件结构是什么?
- google-maps - 保护 Google Maps API 密钥
- perl - 在 Intellij 和 Perl 插件中找不到包文件警告
- reactjs - Aws Mobile Hub:将前端与后端分开
- javascript - overflow-x 滚动属性适用于桌面,但不适用于手机