我在页面上有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
提前致谢。
答案 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,但是不适用于您的样本。最令人困惑的。