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

时间:2013-04-02 13:49:30

标签: asp.net-mvc razor partial-views ajax.beginform

我知道也许标题听起来有点奇怪,但我相信我的问题确实很奇怪。我有一个带有Razor视图引擎的ASP.NET MVC 4应用程序(这是我的第一个MVC实际应用程序)。

我有一个布局视图,我在这里渲染两个部分视图:

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

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

Login控制器中的每个操作都只呈现部分视图:

    [ChildActionOnly]
    public ActionResult RenderLoginPopup()
    {
        return PartialView("Partial/_LoginPopupPartial");
    }

仅为了举例说明(两者都以相同的方式构建),登录部分视图包含一个像这样的ajax表单:

@using (Ajax.BeginForm("Login", "Login", new AjaxOptions()
    {
        HttpMethod = "POST",
        OnSuccess = "loginResponseReceived"
    }, new { @id = "loginForm" }))

来自Login控制器的Login操作(表单的目标)使用以下属性进行签名(值得一提并注意HttpPost):

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public JsonResult Login(LoginModel model)
    { }

到目前为止,非常好......一切都很完美 - 登录和注册操作都没有任何问题。

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

    @using (Html.BeginForm())
    {
       <input type="hidden" name="name"/>
       <input type="submit" value="Send"/>
    }

以及控制器CaptionExtendedController:

    [HttpPost]
    public ActionResult Index(string nume)
    {
        return View();
    }

所以,最后,在我的最终html生成文件中,我将有3个表单 - 2个用于登录和注册(ajax),以及一个从最后一个视图生成的简单表单。请记住,所有三种形式都是独立的(意味着它们不是彼此的)。

问题在于,每当我按下最后一个表单中的“发送”按钮时,所有使用我的视图中的[HttpPost]属性签名的控制器(登录,从LoginController注册,从CaptionExtendedController注册)都会被调用。 / p>

WHY ???为了进行临时修复,我已经从登录和注册操作中删除了[HttpPost]属性,现在它正在运行,但我不认为这是正确的。

拜托,有人可以解释我为什么会这样,并最终指出我正确的方向来解决这个问题?

提前谢谢。

3 个答案:

答案 0 :(得分:0)

尝试使用Html.BeginForm指定控制器和操作,我们可以从那里开始。此外,您可以使用 @ Html.RenderPartial 来渲染您的部分内容,这些部分可以摆脱一些不需要的操作/控制器,使其更易于管理。

答案 1 :(得分:0)

这不能解决根本问题,但可能是一种解决方法,无论如何都是你需要的。 :)

您可以编写一些jQuery来捕获按钮单击,然后直接按名称提交表单。例如,如果您添加以下ID:

@using (Html.BeginForm())
{
   <input type="hidden" name="name"/>
   <input type="submit" id="regularSubmitButton" value="Send"/>
}

然后你可以写:

$(document).ready(function() {
   $("#regularSubmitButton").click(function(e) {
       e.preventDefault();

       $(this).parent("form").submit();

       return false;
   });
});

我不确定如果没有看到所有东西它会起作用,但似乎值得一试。

干杯, 迈克尔

答案 2 :(得分:0)

它没有任何意义......从评论和答案开始,我已经在这些棘手的形式上将3个函数映射到提交:登录,注册和索引(我还将HttpPost属性放回到登录和注册操作)。在那些jquery函数中,我只是用字符串(表单名称)发出警报;为了能够编写一个基于jquery id的选择器,我已经声明了最后一个带有id的表单(它没有它;只有login和register有一个),就像这样(从另一个表单中取一个例子)同样的问题):

@using (Html.BeginForm("Index", "PersonalizeCard", new {data = Model.EncryptedDataQueryStringValue}, FormMethod.Post, new {@id = "personalizeCardForm"})) { }

(已添加的内容 - 最后两个参数 - form method和html id)。

在此之后,我已经运行了应用程序而且没有例外......我已经在登录和注册操作上设置了断点 - 没有...我甚至从BeginForm中删除了这两个额外的参数 - 仍然没有...

WHY ????再次,为什么???我的意思是,我并不感到不安,但我不明白为什么它自己固定......

感谢您的所有时间和评论/答案。