2010-10-01 57 views
0

我的网页上有2种形式,它们都包括在母版,像这样:mvc.net多种形式childaction

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

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

我确定我犯了一个简单的错误,就是看不到它。演示该问题

项目可以在这里找到:提前TestMVC.zip

感谢。

+0

我已经添加了一个测试项目,在c#中演示了这个问题。 – jimplode 2010-10-01 10:48:46

+0

有甚至有另一种方法来实现相同的事情?如果对象恰好无效,则保留后期数据。 – jimplode 2010-10-01 11:28:51

回答

1

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

ok ...第一步,从发布操作中移除childonlyaction属性,并添加控制器/操作以在提交表单时运行。

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

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

下一步是找出我想要返回的东西。

所以..我需要的,如果存在验证错误,等等。所以想我可以做到这一点使用元数据或其他自定义验证,模型添加到TempData,然后返回定制机型做一个RedirectToAction作出行动我来自的页面。即/首页/索引或/控制器/动作

我从引用链接获取控制器/操作,应该始终将其设置为来自后操作。

任何人都可以想到一个更好的方式做到这一点?因为这是我能找到的结果,我希望在不使用Ajax的情况下获得结果的唯一方法

0

我看到,当你渲染你的表单时,你没有明确地命名它们,你也没有提及表单方法。你为什么要使用“Html.RenderAction”

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

如果您使用的是子控件,则:能否请您做这样的事?它不应该是“Html.RenderPartial”,如:

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

不,因为窗体不应该从路由上自己可见我使用因此必须使用RenderAction。所以不能在表单中指定控制器或动作,因为它会尝试在表单路径上显示该表单,并且我不想要。除非我错过了这个应该怎么做? – jimplode 2010-10-01 10:44:12

+1

我没有独立的解释,但是你的Html.BeginForm()是罪魁祸首。因为你没有指定动作名称。结果是.net会自动将默认操作设置为“/”(检查视图源)。话虽如此,当你点击其中一个按钮时,它们会发布到同一页面,因此你正在击中两个子窗体的“Post”。我不确定你为什么不想去RenderPartial? URL上显示的子路由是如此关键的一点? – Pradeep 2010-10-01 12:02:45

+0

谢谢你的解释,这是有道理的。但我想要的是这些都是有效的UserControls,自包含的形式。我希望能够将这些包含在我的网站的任何位置。如果有更容易或更正确的方法来实现同样的事情,那么请教育我。 – jimplode 2010-10-01 12:11:30

0

如果你把[ChildActionOnly]关闭后你的行动,只提交到一个动作在同一时间。

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

此链接(http://dotnetslackers.com/articles/aspnet/ASP-NET-MVC-2-0-Using-Multiple-Actions.aspx)似乎表明,删除ChildActionOnly是你所需要做的,但在您的示例中不起作用。最令人困惑的。

+0

我已经看到引用这个是MVC框架中的错误....我可以不相信这是你在MVC中无法做到的事! – jimplode 2010-10-03 09:12:09