1

我知道也许标题听起来有点奇怪,但我相信我的问题确实很奇怪。我有一个带有 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 的索引)都会被调用。

为什么???为了进行临时修复,我从 Login 和 Register 操作中删除了 [HttpPost] 属性,现在它可以工作了,但我认为这不正确。

拜托,有人可以向我解释为什么会发生这种情况,并最终指出我解决此问题的正确方向吗?

先感谢您。

4

3 回答 3

0

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

于 2013-04-02T15:31:02.857 回答
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;
   });
});

我不确定它是否会在没有看到所有内容的情况下起作用,但似乎值得一试。

干杯,迈克尔

于 2013-04-02T15:43:03.857 回答
0

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

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

(添加了什么 - 最后两个参数 - 表单方法和 html id)。

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

为什么????再说一遍,为什么???我的意思是,我并不难过它已修复,但我不明白为什么它会自行修复...

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

于 2013-04-03T07:07:30.527 回答