我知道也许标题听起来有点奇怪,但我相信我的问题确实很奇怪。我有一个带有 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] 属性,现在它可以工作了,但我认为这不正确。
拜托,有人可以向我解释为什么会发生这种情况,并最终指出我解决此问题的正确方向吗?
先感谢您。