Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# mvc.net多表单子动作_C#_Asp.net Mvc_Vb.net - Fatal编程技术网

C# mvc.net多表单子动作

C# mvc.net多表单子动作,c#,asp.net-mvc,vb.net,C#,Asp.net Mvc,Vb.net,我在一页上有两个表单,它们包含在母版页中,如下所示: Html.RenderAction("Form1", "Controller") 及 控制器具有以下功能: <ChildActionOnly()> Function Form1() As ActionResult Return View("Form1", New ModelObject()) End Function <ChildActionOnly()> <AcceptVerbs(HttpVer

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

Html.RenderAction("Form1", "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

函数Form1()作为ActionResult
返回视图(“Form1”,新的ModelObject())
端函数


提前感谢。

我看到,当您呈现表单时,您没有明确地命名它们,也没有提到表单方法。你能不能这样做:

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

如果您使用的是子控件,那么为什么要使用“Html.RenderAction”?它不应该是“Html.RenderPartial”吗


如果从Post操作中删除
[ChildActionOnly]
,则每次只提交一个操作

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


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

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

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

Html.BeginForm("Form1", "Form")
这确保调用了正确的post操作

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

所以。。如果存在验证错误等,我需要返回自定义模型。因此我想我可以使用元数据或其他自定义验证来执行此操作,将模型添加到
TempData
中,然后执行
RedirectToAction
,使该操作成为我的页面。i、 e./主页/索引或/控制器/操作

我从推荐人那里获得控制器/操作,这应该始终设置为来自post操作


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

no,因为表单本身不应该从路径上可见,所以我必须使用渲染。因此,无法在表单中指定控制器或操作,因为它将尝试在表单路由的post上显示该表单,这是我不希望看到的。除非我在如何做这件事上遗漏了什么,否则我没有详细的解释,但你的Html.BeginForm()就是罪魁祸首。因为您没有指定操作名称。结果是.net自动将默认操作设置为“/”(检查视图源)。如上所述,当您单击其中一个按钮时,它们将发布到同一页面,因此您将点击两个子表单的“Post”。我不知道你为什么不想去RenderPartial?子路由在URL上是否可见是一个关键点?感谢您的解释,这很有意义。但我想要的是这些有效的用户控件,自包含的表单。我希望能够包括在我的网站的任何地方这些。如果有一种更简单或更正确的方法来实现同样的目标,请有人教我。这方面的一个例子是“回电”表单,供用户填写,而不管他们在哪个页面上。如果您想要回电功能,那么建议您可以用Ajax方式实现该功能。使用JS和jQuery发布数据。这应该行得通。我在c#中添加了一个测试项目来演示这个问题。有没有其他方法可以实现同样的效果??如果对象恰好无效,则在post上保留数据。我已经看到MVC框架中提到这是一个错误。。。。我不敢相信这是你在MVC里做不到的!!
<% using (Html.BeginForm("ACTION", "CONTROLLER")) {%>
<% Html.RenderPartial("Search"); %>
Html.BeginForm("Form1", "Form")