提交表单并将数据传递给 FileStreamResult 类型的控制器方法

Posted

技术标签:

【中文标题】提交表单并将数据传递给 FileStreamResult 类型的控制器方法【英文标题】:Submitting form and pass data to controller method of type FileStreamResult 【发布时间】:2013-01-02 15:11:10 【问题描述】:

我有一个 mvc 表单(由模型制成),提交时我想获取一个参数 我有设置表单和获取参数的代码

using (@html.BeginForm("myMethod", "Home", FormMethod.Get, new  id = @item.JobId ))

在我的家庭控制器中,我有

    [HttpPost]
    public FileStreamResult myMethod(string id)
    
         sting str = id;

    

但是,我总是得到错误

您正在寻找的资源(或其依赖项之一)可以 已被删除、已更改名称或暂时 不可用。请查看以下 URL 并确保它是 拼写正确。

当我省略[HttpPost] 时,代码会执行文件,但变量strid 为空。 请问如何解决这个问题?

编辑

这可能是因为控制器中的 myMethod 不是 ActionResult 造成的吗?我意识到,当我有一个 Actionresult 类型的方法并且该方法绑定到一个视图时,一切正常。但是 FileStreamresult 类型不能绑定到视图。如何将数据传递给这些方法?

【问题讨论】:

您在表单声明中指定了 GET,但希望它调用您的 POST 方法? 我也尝试省略 HttpPost,但我的变量 str 和 id 始终为空。我尝试将表单方法更改为 post 但没有区别。 你的视图是强类型的吗? 我返回的不是视图而是 FileStreamResult。所以,我没有在控制器中向 myMethod 添加视图的选项 但是您仍然可以强输入包含表单的视图并使用 mvc 的内置约定和模型绑定传递数据。这不会影响您返回 fileStreamResult 的事实 【参考方案1】:

如有疑问,请遵循 MVC 约定。

如果您还没有包含 JobID 的属性,请创建一个 viewModel

public class Model

     public string JobId get; set;
     public IEnumerable<MyCurrentModel> myCurrentModel  get; set; 
     //...any other properties you may need

强烈键入您的视图

@model Fully.Qualified.Path.To.Model

为表单添加 JobId 的隐藏字段

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post))
   
    //...    
    @Html.HiddenFor(m => m.JobId)

并接受模型作为控制器操作中的参数:

[HttpPost]
public FileStreamResult myMethod(Model model)

    sting str = model.JobId;

【讨论】:

@jpo 回应您的编辑:您从 POST 方法返回的内容对模型绑定绝对没有影响。只要您的模型是 IEnumerable,只需将其添加到视图模型(请参阅编辑)。如果您遵循我在此处概述的模式,则应该没有任何问题。 会尝试的。假设 JobId 是 myCurrentModel 的一个元素,我该如何初始化字符串 str?我试过 sting str = model.single().JobId 但我收到错误“序列包含多个元素” 使用First()FirstOrDefault()或为Single()指定条件【参考方案2】:

这是因为您已将表单方法指定为 GET

将视图中的代码更改为:

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new  id = @item.JobId ))

【讨论】:

【参考方案3】:

您似乎正在使用FormMethod.Get 指定表单以使用HTTP 'GET' 请求。除非您告诉它发布帖子,否则这将不起作用,因为这似乎是您希望 ActionResult 执行的操作。这可能通过将FormMethod.Get 更改为FormMethod.Post 来实现。

除此之外,您可能还想考虑 Get 和 Post 请求是如何工作的,以及它们如何与模型交互。

【讨论】:

【参考方案4】:

这里的问题是模型绑定,如果你指定一个类,那么模型绑定可以在发布期间理解它,如果它是一个整数或字符串,那么你必须指定 [FromBody] 才能正确绑定它。

在 FormMethod 中进行以下更改

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new  id = @item.JobId ))

在你的家庭控制器中,你应该指定 [FromBody]

using System.Web.Http;
[HttpPost]
public FileStreamResult myMethod([FromBody]string id)

     // Set a local variable with the incoming data
     string str = id;


FromBody 在 System.Web.Http 中可用。确保您有对该类的引用并将其添加到 cs 文件中。

【讨论】:

确保你引用了 System.Web.Http;

以上是关于提交表单并将数据传递给 FileStreamResult 类型的控制器方法的主要内容,如果未能解决你的问题,请参考以下文章

React 在模态中使用表单将输入的数据传递给函数

使用 jquery ajax 将数据传递给 php 的问题

Angular2 - 将 ASYNC 数据传递给子组件

将 POST 数据传递给两个 php 文件

Flutter如何将表单数据传递给api

在同一视图中使用多个模型时将表单数据传递给模型