Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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
Asp.net mvc 使用来自不同控制器的[HttpPost]回发所有控制器操作时查看表单调用_Asp.net Mvc_Razor_Partial Views_Ajax.beginform - Fatal编程技术网

Asp.net mvc 使用来自不同控制器的[HttpPost]回发所有控制器操作时查看表单调用

Asp.net mvc 使用来自不同控制器的[HttpPost]回发所有控制器操作时查看表单调用,asp.net-mvc,razor,partial-views,ajax.beginform,Asp.net Mvc,Razor,Partial Views,Ajax.beginform,我知道这个标题听起来有点奇怪,但我相信我的问题确实很奇怪。我有一个ASP.NETMVC4应用程序这是我第一个使用RazorView引擎的MVC现实世界应用程序 我有一个布局视图,其中渲染两个局部视图,如下所示: <!-- Login --> @Html.Action("RenderLoginPopup", "Login") <!-- Registration --> @Html.Action("RenderRegisterPopup", "Login") @usin

我知道这个标题听起来有点奇怪,但我相信我的问题确实很奇怪。我有一个ASP.NETMVC4应用程序这是我第一个使用RazorView引擎的MVC现实世界应用程序

我有一个布局视图,其中渲染两个局部视图,如下所示:

 <!-- Login -->
@Html.Action("RenderLoginPopup", "Login")

<!-- Registration -->
@Html.Action("RenderRegisterPopup", "Login")
@using (Ajax.BeginForm("Login", "Login", new AjaxOptions()
    {
        HttpMethod = "POST",
        OnSuccess = "loginResponseReceived"
    }, new { @id = "loginForm" }))
    @using (Html.BeginForm())
    {
       <input type="hidden" name="name"/>
       <input type="submit" value="Send"/>
    }
为了举例说明,这两个视图都是以相同的方式构建的,登录部分视图包含如下ajax表单:

 <!-- Login -->
@Html.Action("RenderLoginPopup", "Login")

<!-- Registration -->
@Html.Action("RenderRegisterPopup", "Login")
@using (Ajax.BeginForm("Login", "Login", new AjaxOptions()
    {
        HttpMethod = "POST",
        OnSuccess = "loginResponseReceived"
    }, new { @id = "loginForm" }))
    @using (Html.BeginForm())
    {
       <input type="hidden" name="name"/>
       <input type="submit" value="Send"/>
    }
表单目标登录控制器的登录操作使用以下值得一提的属性进行签名,请注意HttpPost one:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public JsonResult Login(LoginModel model)
    { }
到目前为止,一切都很好。。。一切都很完美-登录和注册操作都正常工作,没有任何问题

当我在一个与主布局一起加载的视图中有一个@Html.BeginForm时,就会出现我想要谈论的问题。例如,如果我有这样一个简单的形式:

 <!-- Login -->
@Html.Action("RenderLoginPopup", "Login")

<!-- Registration -->
@Html.Action("RenderRegisterPopup", "Login")
@using (Ajax.BeginForm("Login", "Login", new AjaxOptions()
    {
        HttpMethod = "POST",
        OnSuccess = "loginResponseReceived"
    }, new { @id = "loginForm" }))
    @using (Html.BeginForm())
    {
       <input type="hidden" name="name"/>
       <input type="submit" value="Send"/>
    }
最后,在最终生成的html文件中,我将有3个表单——2个用于登录和注册ajax,以及一个从上一个视图生成的简单表单。请记住,所有三种形式都是独立的,这意味着它们不是一个在另一个

问题是每次我按下按钮时,都会调用从上一个表单发送所有使用[HttpPost]属性从我的视图登录、从LoginController注册和从CaptionExtendedController索引签名的控制器

为什么???为了得到一个临时修复,我已经从登录和注册操作中删除了[HttpPost]属性,现在它可以工作了,但我认为这不正确

请,有人能向我解释为什么会发生这种情况,并最终为我指出解决这个问题的正确方向吗


提前感谢。

尝试使用Html.BeginForm指定控制器和操作,我们可以从那里开始。此外,您还可以使用@Html.RenderPartial来呈现您的部分,这将消除一些不必要的操作/控制器,使其更易于管理。

这并没有解决根本问题,但可能是一项解决方法,这正是您所需要的

您可以编写一些jQuery,它捕捉到按钮单击,然后直接按名称提交表单。例如,如果在下面添加id:

@using (Html.BeginForm())
{
   <input type="hidden" name="name"/>
   <input type="submit" id="regularSubmitButton" value="Send"/>
}
我不确定在看不到所有东西的情况下它是否有效,但似乎值得一试

干杯,
迈克尔

这已经没有意义了。。。从注释和答案开始,我将3个函数映射到那些复杂表单上的提交:login、register和index。我还将HttpPost属性放回login和register操作。在这些jquery函数中,我刚刚用字符串名称发布了一个警报,其形式如下:;为了能够编写一个基于jquery id的选择器,我还声明了最后一个带有它没有的id的表单;只有login和register有一个,如下所示,这是一个从另一个具有相同问题的表单中获取的示例:

@using (Html.BeginForm("Index", "PersonalizeCard", new {data = Model.EncryptedDataQueryStringValue}, FormMethod.Post, new {@id = "personalizeCardForm"})) { }
添加的内容—最后两个参数—表单方法和html id

在此之后,我运行了应用程序,不再出现异常。。。我在登录和注册操作上设置了断点-无。。。我甚至从BeginForm中删除了这两个额外的参数-仍然没有什么

为什么????再说一遍,为什么???我的意思是,我并没有因为它被修复而难过,但我不明白为什么它被自己修复了


感谢您的宝贵时间和评论/回答。

我会为每个表单分配一个ID,并使用jQuery处理它们,就像前两个已经通过Ajax使用jQuery生成一样。但是我需要将第三个表单作为普通表单。另外,如果我这样做,这意味着从现在起,我网站上的所有表单都应该使用Ajax.BeginForm或jquery来完成,对吗?现在听起来这不是一个选择。谢谢你抽出时间。这是个好主意。另一个我无法从您发布的代码中看出的考虑因素是:是否有可能异步表单的using块的关闭丢失或放错了位置?我想不会,但如果你们有,也许可以解释。谢谢大家。一步一步:@MichaelKennedy-形式open/close/using语句没有重叠;我还检查了HTML生成的文件,所有表单的打开和关闭都非常正常。带有HTML.BeginForm的示例来自一个仅为测试而创建的简单页面,但我所有的HTML.BeginForm或Ajax.BeginForm都将操作和控制器作为参数接收。关于Html.RenderPartial而不是Html.Action,我使用了更高版本,因为我想让我的部分视图登录并注册它们自己的上下文和模型;我知道我可以使用RenderPartial传递一个空的新模型,这对于登录来说是可以的,但是对于Register,我需要在它自己的控制器中填充一些数据DDL等。不确定这是否有任何区别,但我确实在索引操作-字符串nume上看到了拼写错误。如果这是复制粘贴的,那么m
可能也是一个原因。Nume只是为了英文的缘故,我翻译成了名字,但可能我并没有在所有地方都这么做。另一方面,我已经进入调试模式vs 2012,我已经在我的页面登录、注册和索引的所有httppost操作上设置了断点,并且所有3个断点都达到了。。。这让我想到了另一个想法——在这些表单的提交事件中添加一些断点console.log,但今天早些时候,我观察了Fiddler中发生的情况,实际上只有一个表单提交了…似乎我发现了类似的问题,但仍然没有响应…: