上传文件时如何处理服务器端的验证错误ASP.NET MVC

问题描述 投票:-1回答:2

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

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

所需的行为:用户不必重新选择输入中的文件即可再次上传。

当前解决方案:我在服务器上的Session中序列化并保存上载的文件,然后在Model上设置一个属性,该属性告诉View会话中已保存文件并删除要上传的输入类型文件,然后重新提交后,如果表单有效,请从Session中反序列化文件,对文件执行我需要做的操作,然后将其从Session中删除。

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

c# asp.net asp.net-mvc asp.net-core-2.1
2个回答
0
投票

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

[当您离开焦点时,您可以使用AJAX验证表单中的字段。这样可以保证当他们提交表单时,表单中的字段始终是正确的。我发现前端验证和服务器端验证的最佳组合效果最好,并且后端没有所有功能。


0
投票

[您在评论中表示,他们不希望使用Ajax解决方案,但是SO的目的是提供对许多人有用的答案,而不仅仅是OP,因此,我在下面发布我的答案,希望对您有所帮助。其他。

由于安全原因,您猜到了,没有主流的浏览器可以访问用户选择的文件的实际路径。您的服务器代码将不会收到真实路径,甚至JavaScript也无法访问它。而是,浏览器生成伪造的路径,并且其中唯一的真实值是文件名。

出于这个原因,提交表单后,将文件保留在当前设计(即标准表单)中的唯一方法就是您在问题中所描述的方式。显然,这不是一个好方法,特别是如果文件太大,则每次往返服务器都将花费很长时间。

为了解决不同的问题,您需要更改设计。您需要使浏览器保留真实路径值。唯一的方法是不提交表单。因此,您需要提交表单值而不提交表单。我能想到的唯一方法是使用Ajax提交表单。这意味着服务器端验证的结果将必须作为Ajax响应(通常是Jason,但可以根据需要以其他方式序列化)返回,然后JavaScript将采用该响应并将错误显示为需要。这样,仍然每次都将文件重新提交给服务器,但是服务器至少不需要像问题中所述的那样将其发送回客户端。这样可以节省一半的带宽,但是需要更多的编程。

© www.soinside.com 2019 - 2024. All rights reserved.