我知道也许标题听起来有点奇怪,但我相信我的问题确实很奇怪。我有一个带有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]属性,现在它正在运行,但我不认为这是正确的。
拜托,有人可以解释我为什么会这样,并最终指出我正确的方向来解决这个问题?
提前谢谢。
答案 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 ????再次,为什么???我的意思是,我并不感到不安,但我不明白为什么它自己固定......
感谢您的所有时间和评论/答案。