提交表单并将数据传递给 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]
时,代码会执行文件,但变量str
和id
为空。
请问如何解决这个问题?
编辑
这可能是因为控制器中的 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 类型的控制器方法的主要内容,如果未能解决你的问题,请参考以下文章