mvc.net多表单子行为

时间:2010-10-01 10:07:05

标签: c# asp.net-mvc vb.net

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

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

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

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帖子和Form2帖子,但表格集合中的值是从哪个表格提交。

我的问题是: 为什么这两个表单都提交了一组表单数据? 如何才能使用正确的表单数据调用相关操作?

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

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

提前致谢。

3 个答案:

答案 0 :(得分:1)

我找到了问题的解决方案,想知道是否有人想评论这种“解决方法”的正确性。

ok ...所以第一步,从post操作中删除childonlyaction属性,并添加要在提交表单时运行的控制器/操作。

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

这可以确保调用正确的帖子操作。

下一步是找出我想要归还的东西。

所以..如果存在验证错误等,我需要返回自定义模型。所以我想我可以使用元数据或其他一些自定义验证来做到这一点,将模型添加到TempData然后执行{{ 1}}使动作成为我来自的页面。即/ Home / Index或/ Controller / Action

我从引荐来源获取控制器/操作,应该始终设置,因为这来自后期操作。

有人能想到更好的方法吗?因为这是我能够在不使用Ajax的情况下找到我想要的结果的唯一方法

答案 1 :(得分:0)

我看到当你渲染表单时,你没有明确地命名它们,你也没有提到表单方法。你能不能做这样的事情:

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

如果您使用的是儿童控件,那么为什么使用“Html.RenderAction”?不应该像“Html.RenderPartial”那样:

<% Html.RenderPartial("Search"); %>

答案 2 :(得分:0)

如果您从发布后的操作中删除[ChildActionOnly],则一次只能提交一个操作。

因此,考虑它的一种方法是尝试找出如何将部分视图作为整个页面返回。也许将页面的路线存储在模型周围的ViewModel中,并在该路线上使用RedirectToAction

这个链接(http://dotnetslackers.com/articles/aspnet/ASP-NET-MVC-2-0-Using-Multiple-Actions.aspx)似乎建议您只需要删除ChildActionOnly,但是不适用于您的样本。最令人困惑的。