【问题标题】:ASP.NET MVC3: 2 forms on page, submit triggers the wrong oneASP.NET MVC3:页面上有 2 个表单,提交会触发错误的表单
【发布时间】:2011-05-09 17:38:26
【问题描述】:

我在同一页面上有 2 个表单。一种是局部视图中的表单,它通过我们称之为 PodForm 的子操作呈现。第二个由当前动作呈现。

所以我的代码看起来有点像这样(请忽略名称等,这是示例代码):

Form.cshtml

@model MyProject.Models.FormInputModel
@using(Html.BeginForm("Form","Main",FormMethod.Post))
{
  @Html.TextBoxFor(x=>x.AField)
  @* Some other fields *@
  <input type="submit"/>
}

<div class="sidebar">
   @Html.Action("PodForm","Pod")
</div>

PodForm.cshtml

@model MyProject.Models.PodFormInputModel
@using(Html.BeginForm("PodForm","Pod",FormMethod.Post))
{
  @Html.TextBoxFor(x=>x.Name)
  @* Some other fields *@
  <input type="submit"/>
}

当我在主窗体上单击提交时,会触发 PodForm 操作方法。怎么回事?

编辑 - 根据 cmets 的要求

  1. 生成的标记类似于以下内容。

    <form action="/Main/Form" encoding="multipart/form-data" method="POST">
         <input type="text" name="AField" />
         <input type="submit" />
      </form>
    
     <div class="sidebar">
       <form action="/Pod/PodForm" method="POST">
           <input type="text" name="Name" />
           <input type="submit" />
       </form>
     </div>
    
  2. 控制器动作

    “MainController”(不是实际名称)有一个名为“Form”的动作

    public MainController : Controller
    {
        public ActionResult Form()
        {
            return View();
        }
    
        [HttpPost]
        public ActionResult Form()
        {
            if(ModelState.IsValid)
            {
              //Save
            }
    
            return View();
        }
    }
    

    “PodController”(不是实际名称)有一个名为“PodForm”的操作。 HttpPost 不返回 View 的原因是从子操作中执行此操作只会返回部分视图 - 而不是我想要的。

        public PodController : Controller
        {
           public ActionResult PodForm()
           {
              return View();
           }
    
           [HttpPost]
           public ActionResult PodForm(PodFormInputModel model)
           {
              if(ModelState.IsValid)
              {
                 //Save the thing   
    
                  return RedirectToAction(Request.HttpReferrer.ToString()).AndFlash("Saved");
              }
    
              return RedirectToAction(Request.HttpReferrer.ToString()).AndFlash("Not saved");
           }
        }
    

更新:我发现第一个操作方法 调用,但因为它返回 View(),视图引擎将 PodForm 操作方法作为 Post 而不是作为获取触发提交逻辑的内容。很奇怪。

【问题讨论】:

  • 只要你有两个独立的form 标签,这应该可以工作。生成的 HTML 是什么样的?
  • 在 div 中调用 FormPod 动作,在 PodForm.cshtml 中为 PodForm 动作呈现表单。您的控制器中有哪些操作?
  • 我相信生成的 HTML 没有到达这里。那会很有帮助。
  • @Nick 抱歉,这是答案中的格式问题。

标签: forms asp.net-mvc-3 child-actions


【解决方案1】:

我发现主窗体的 Action 方法首先被击中并正确响应。但是,当主窗体的视图呈现时,pod 窗体的子操作也会呈现,但由于请求是帖子,它会呈现 HttpPost 操作方法,从而导致问题。

我已通过重命名 HttpPost 方法并更改 PodForm.cshtml 以使用此新操作方法来修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多