代码之家  ›  专栏  ›  技术社区  ›  jimplode

MVC.NET多表单子操作

  •  0
  • jimplode  · 技术社区  · 14 年前

    我在一页上有两个表单,它们包含在母版页中,如下所示:

    Html.RenderAction("Form1", "Controller")
    

    Html.RenderAction("Form2", "Controller")
    

    控制器具有以下功能:

    <ChildActionOnly()>
    Function Form1() As ActionResult
    
        Return View("Form1", New ModelObject())
    
    End Function
    
    <ChildActionOnly()> <AcceptVerbs(HttpVerbs.Post)>
    Function Form1(ByVal formCollection As FormCollection) As ActionResult
    
        Return View("Form1", New ModelObject())
    
    End Function
    
    
    
    <ChildActionOnly()>
    Function Form2() As ActionResult
    
        Return View("Form2", New ModelObject())
    
    End Function
    
    <ChildActionOnly()> <AcceptVerbs(HttpVerbs.Post)>
    Function Form2(ByVal formCollection As FormCollection) As ActionResult
    
        Return View("Form2", New ModelObject())
    
    End Function
    

    ascx中的表单标记如下,它们本质上是相同的表单,因此标记非常相似:

    <%  Using Html.BeginForm()%>
    <%= Html.TextBoxFor(Function(model) model.Property1, New With {.class = "input"})%>
    <input type="submit" class="submitbutton" value="" name="submit" />
    <%  End Using%>
    

    问题是,当我提交任何一个表单时,它都会运行两个post方法。

    所以form1 post和form2 post,但是表单集合中的值是从中提交表单的。

    我的问题是: 为什么要用一组表单数据提交两个表单? 如何使其仅调用具有正确表单数据的相关操作?

    我确信我犯了一个简单的错误,只是看不见它。

    可以在此处找到演示问题的项目: TestMVC.zip

    事先谢谢。

    3 回复  |  直到 11 年前
        1
  •  1
  •   jimplode    14 年前

    我找到了解决这个问题的方法,想知道是否有人愿意对这个“解决问题”的正确性发表评论。

    好啊。。。因此,第一步,从post操作中删除childOnlyAction属性,并添加要在提交表单时运行的控制器/操作。

    Html.BeginForm("Form1", "Form")
    

    这确保调用了正确的post操作。

    下一步是找出我想要的回报。

    所以…如果存在验证错误等,我需要返回自定义模型。因此我认为可以使用元数据或其他自定义验证来完成此操作,请将模型添加到 TempData 然后做一个 RedirectToAction 使动作成为我的源页面。即/home/index或/controller/action

    我从推荐人那里得到控制器/动作,因为这是来自一个事后动作,所以应该总是被设置。

    有人能想出更好的办法吗??因为这是唯一一种不用Ajax就可以得到我想要的结果的方法。

        2
  •  0
  •   Pradeep    14 年前

    我看到,在呈现表单时,您没有明确地命名它们,也没有提到表单方法。你能做这样的事吗?

    <% using (Html.BeginForm("ACTION", "CONTROLLER")) {%>
    

    如果您使用的是子控件,那么为什么要使用“html.renderAction”?不应该是“html.renderpartial”,比如:

    <% Html.RenderPartial("Search"); %>
    
        3
  •  0
  •   pete the pagan-gerbil    14 年前

    如果你采取 [ChildActionOnly] 在您的后期操作之外,它一次只提交一个操作。

    所以考虑它的一种方法是尝试找出如何返回整个页面的部分视图。可能通过在模型周围的视图模型中存储页面的路由,并使用 RedirectToAction 在那条路线上?

    此链接(http://dotneslackers.com/articles/aspnet/asp-net-mvc-2-0-using-multiple-actions.aspx)似乎建议您只需删除childactionOnly,但在示例中不起作用。最令人困惑的。