【问题标题】:Run MVC controller action without the view?在没有视图的情况下运行 MVC 控制器操作?
【发布时间】:2011-01-13 19:28:54
【问题描述】:

我有一个 ExcelResult 操作结果,它根据 Stephen Walther tip 返回 Microsoft Excel 文档。基本上它只是将一个流写入响应。在调试 VS 2010 (ASP.NET Dev Server) 时,它运行良好,但是当我在 IIS 6 机器上运行它时,出现以下错误:

未找到视图“GenerateExcel”或其主视图。搜索了以下位置: ~/Views/Home/GenerateExcel.aspx ~/Views/Home/GenerateExcel.ascx ~/Views/Shared/GenerateExcel.aspx ~/Views/Shared/GenerateExcel.ascx

没有关联的视图,因此没有文件,但不应该有。我做错了什么?

更新

通过简单地返回 void 而不是 ActionResult,我不再有这个问题。我没有返回 ExcelResult,而是显式调用它的 ExecuteResult 方法,该方法正在写入输出流。

之前

public ActionResult GenerateExcel()
{
    return this.Excel(parameters);
}

之后

    public void GenerateExcel()
{
ExcelResult excelResult = this.Excel(parameters);
excelResult.ExecuteResult(null);
}

在那之后,我的 NTLM 身份验证出现了安全问题,但它们“消失了”(这意味着我希望它们会回来)。不过,目前一切正常。

【问题讨论】:

  • 你不觉得在不展示你在做什么(一些代码什么的)的情况下说你做错了什么有点困难吗?不幸的是,我没有心灵感应技能。
  • 嗯基本上可以查看链接上的代码。它返回一个 ActionResult,它实际上是一个 ExcelResult,其 ExecuteResult 方法正在写入输出流。
  • @DougJones 老问题,但只是想指出:最好以某种格式编写问题,这样人们就不必通过链接来理解问题的基本部分。问题应该足够清楚,无需链接即可理解;可以添加链接以提供额外的、深入的资源等。

标签: asp.net-mvc asp.net-mvc-2


【解决方案1】:

确保您的操作方法不返回 ActionResult:

public void DoSomething()

【讨论】:

  • 哦,不是每个动作都应该返回一个ActionResult。在这种情况下,他想要一个 ExcelResult,这是一个自定义操作结果,但仍然是一个操作结果。
  • 控制器中的每个公共方法都是一个动作方法,可以通过合适的 URL 调用。当他将流写入 Response 时,它​​可以工作。
  • 这让我犯了另一个错误!我只是看到了一个空白页,而不是附加的 excel 文档。我在 Fiddler 中看到我现在通过 NTLM Windows 身份验证收到 401 拒绝访问错误,尽管其他控制器操作(带有视图)显示得很好。
【解决方案2】:

这在我们有数百或数千个视图的情况下非常有用。在那种情况下,我们会创建成百上千个控制器动作吗?当然不是,那我们该如何解决呢?

在 MVC 框架中,控制器类包含一个方法 HandleUnknownAction(),每当我们尝试在不存在的控制器上调用操作(或当我们请求没有匹配操作方法的视图时)时,该方法都会执行。

我相信,这回答了你的问题。

【讨论】:

    【解决方案3】:

    我没有详细看动作结果的代码,但是你的动作结果一定有问题。您是否继承自其他动作结果而不是 ActionResult 类?你打电话给 base.ExecuteResult 了吗?如果是这样,那就可以解释为什么它正在寻找视图。我创建了几个自定义控制器操作来返回各种文件类型,它们从不寻找视图。

    我同意 cmets 关于返回无效的答案。这绝对是一个黑客。您不应该从您的操作内部调用 ExecuteResult。您基本上是从控制器操作直接写入响应流。显然它可以工作,但它确实不适合 MVC 模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2013-08-28
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2012-11-06
      相关资源
      最近更新 更多