首页 > 解决方案 > 上传文件时如何处理服务器端的验证错误

问题描述

我有一个经过服务器端验证的表单,如果表单包含无效项目,则模型将返回到视图,然后 JavaScript 会突出显示无效的字段。这是一个包含用于文件上传的输入类型文件的多部分表单。我正在使用 Visual Studio 2017、ASP.Net Core 2.1 和 ASP.Net MVC 设计模式。

问题:用户提交表单并附加了一个文件,但由于一个或多个输入字段,表单无效。当通过验证错误将模型传递回视图时,该文件不再附加,因为您无法从服务器填充输入类型文件(至少我不知道,认为这是一项安全功能)。

期望行为:用户不必重新选择输入中的文件以进行第二次上传。

当前解决方案:我在服务器上的 Session 中序列化并保存上传的文件,然后在模型上设置一个属性,告诉视图文件保存在会话中并删除输入类型文件以进行上传,然后重新提交,如果表单是有效的,从 Session 中反序列化文件,对文件做我需要做的事情,然后从 Session 中删除它。

问题:有没有更好的方法来处理这个问题?如果是这样,请提供示例文档或建议。

标签: c#asp.netasp.net-mvcasp.net-core-2.1

解决方案


我不确定你正在做的验证,但它可以移动到前端吗?通常,前端的验证更多的是为了用户体验。(例如,格式不正确、字段留空、字段中的数据类型不正确)。如果是这种情况,我会将其移至前端,否则您可以将其留在后端。

当它们离开焦点时,您可以使用 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; }
}

推荐阅读