【问题标题】:How to submit form values to GET Controller Action in MVC如何将表单值提交到 MVC 中的 GET 控制器操作
【发布时间】:2014-08-04 21:23:38
【问题描述】:

我有一个包含文本框、下拉列表、复选框等的 MVC 表单 (MyAction1)。该表单是使用强类型视图模型生成的。我需要将表单值提交到同一控制器中的另一个页面(MyAction2)。

似乎 FormMethod.Get 是将 MyAction1 的表单值提交给 MyAction2 的 GET 控制器操作的合适选择?或许应该是FormMethod.Post调用MyAction1的POST Controller Action,然后重定向到MyAction2的GET Controller Action?

无论哪种方式,表单值在 MyAction2 的 GET 控制器操作中都不可用。我已经跟踪了代码并使用了 Fiddler 来确认这一点。

我可以使用 jQuery 拦截表单提交。我已经尝试过了,但没有成功。有很多表单控件,所以我不喜欢手动创建查询字符串。

这是怎么做到的?

MyAction1 的观点:

@model My_Web_App.Models.MyAction1ViewModel

@using (Html.BeginForm("MyAction2", "MyController", FormMethod.Get))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    <div class="form-horizontal">

        <!-- Project Name -->
        <div class="form-group">
        @Html.LabelFor(model => model.ProjectName, { @class = "control-label col-md-3" })
            <div class="col-md-9">
            @Html.EditorFor(model => model.ProjectName, new { @class = "form-control" } })
            </div>
        </div>
    </div>

    <div class="form-group">
        <div class="well col-md-offset-4 col-md-4">
            @Html.ActionLink("Submit", "MyAction2", new { Controller = "MyController" },
            new { hidefocus = "hidefocus", id = "btnConsiderSpecificModel", 
            @class = "btn btn-default btn-block", 
            role = "button", 
            type = "submit" })
        </div>
    </div>
}

在 MyAction2 的 GET 控制器动作中:

// GET: MyController/MyAction2/
public ActionResult MyAction2(MyAction1ViewModel formmodel)
{
    MyAction2ViewModel model = new MyAction2ViewModel();

    model.ProjectName = formmodel.ProjectName;
}

使用这种方法,formmodel 充满了空值、0 和假值。似乎 MyAction1 View 根本没有传递表单变量。

【问题讨论】:

  • 表单集合?我们在这里谈论的是什么古老版本的 MVC?我希望: MyAction2(MyAction1ViewModel model) { } 还是仅用于 POST?不确定我是否曾经想在 GET 方法中检索这样的数据。
  • 这只是我最近的尝试之一。我知道这是不对的。没有什么“古老的”。
  • 在这种情况下我会尝试上述建议,可能会结合表单中的提交按钮来解决它。

标签: jquery asp.net-mvc asp.net-mvc-4


【解决方案1】:

试试这个;

public ActionResult MyAction2(MyAction1ViewModel form)
{

你有一个强类型视图,控制器期待MyAction1ViewModel

【讨论】:

  • 我认为问题出在视图中。由于某种原因,FormMethod.Get 不提交任何表单变量。当调用 MyAction2 控制器动作时,一切都为 null、0 或 false。
  • 你能告诉你你的MyAction1ViewModel类吗?
  • 我正在使用 Html.ActionLink 帮助器来创建一个锚链接。它实际上并没有提交表单,只是链接到控制器操作。我将其更改为&lt;input&gt;,然后表单变量在控制器操作中可用。你的回答很好。谢谢你。 ;)
【解决方案2】:

FormCollection 仅适用于 POST 请求。

有几种方法可以获取GET 请求的数据。

  1. 为什么不使用您已经创建的视图模型?

    public ActionResult MyAction2(MyAction1ViewModel model)
    {
        model.ProjectName = model.ProjectName;
    }
    
  2. 您可以简单地将变量的名称添加到您的操作方法中

    public ActionResult MyAction2(string projectName)
    {
        MyAction2ViewModel model = new MyAction2ViewModel();
        model.ProjectName = projectName
    }
    
  3. 您可以查看Request.QueryString 集合。

    public ActionResult MyAction2()
    {
        MyAction2ViewModel model = new MyAction2ViewModel();
        model.ProjectName = Request.QueryString["ProjectName"];
    }
    

【讨论】:

  • 我试过Request["ProjectName"],但它总是为空。
  • 为什么不使用 MyAction1ViewModel ?
  • 谢谢。我认为表单提交中存在问题。 Fiddler 没有显示在 GET 中发送的任何变量。
  • 很高兴为您提供帮助,祝您有美好的一天!
  • 我确信您的示例将在控制器端运行。我认为问题出在视图中。由于某种原因 FormMethod.Get 没有提交表单变量。我稍微编辑了我的问题以显示视图和控制器的编码方式。
猜你喜欢
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多