【问题标题】:FileUpload from API to MVC从 API 上传文件到 MVC
【发布时间】:2015-11-26 09:48:43
【问题描述】:

我有 HTML 页面,我调用 web api 来上传文件。我的客户端代码是:

<input name="file" type="file" id="load-image" />
<script>
...
var data = new FormData();
var files = $("#load-image").get(0).files;
data.append("UploadedImage", files[0]);

var ajaxRequest = $.ajax({
          type: "POST",
          url: "/UploadImage",
          contentType: false,
          processData: false,
          data: data
 });

和服务器端代码:

public class FileUploadController : ApiController
{
 [HttpPost]
 public void UploadImage()
 {
   if (HttpContext.Current.Request.Files.AllKeys.Any())...

它有效。现在我想在 MVC 项目中做同样的事情。我的客户端代码相同,但服务器端代码略有不同。

控制器的基类是控制器(不是 api 控制器),当我尝试这个时:

public class FileUploadController : ApiController
    [HttpPost]
    public void UploadImage()
    {
if (HttpContext.Current.Request.Files.AllKeys.Any())

我收到错误提示“System.Web.HttpContextBase”不包含“当前”的定义...

我应该在 MVC 中进行哪些更改以使文件上传与 webApi 中的工作方式相同? 客户端代码是一样的吗?

【问题讨论】:

  • 尝试使用这个 System.Web.HttpContext.Current
  • 请不要做这样的事情。使用传递给包含文件的路由的模型正确执行此操作。
  • 谢谢菲尔。您是否有一些带有示例或描述如何将模型传递给路由的 url?

标签: c# jquery model-view-controller


【解决方案1】:

这里有一个相关的问题:System.Web.HttpContextBase' does not contain a definition for 'Current' MVC 4 with Elmah Logging

长话短说: 控制器有一个自己的 HttpContext.Current 实现为

public HttpContextBase HttpContext { get; }

因此你应该使用:

System.Web.HttpContext.Current

【讨论】:

  • 我已经做过了,但是想知道,为什么?我会读长篇小说。否则我在 js 文件中有一个错误 - 而不是文件,它是添加到数据中的画布上的图像。
  • 控制器类定义了 HttpContext,因此当你使用没有命名空间的 HttpContext 时,它将使用这个,如果你将使用完整的命名空间,你应该使用与 WebApi 相同的 httpcontext
  • 谢谢。现在很清楚了,但他为什么要这样做?
  • 因为这是编译器基础之一,所以他总是会在类内圈(方法、字段、属性)中查找,然后在外圈中查找。
  • 是的,但是为什么控制器有它自己的实现并且没有包含请求对象呢?
猜你喜欢
  • 2012-11-17
  • 2017-08-28
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多