2013-04-02 19 views
1

我知道也许标题听起来有点不可思议,但我相信,我的问题是确实怪异。我有一个使用Razor视图引擎的ASP.NET MVC 4应用程序(这是我的第一个MVC真实应用程序)。查看表格上回发呼吁所有控制器与[HttpPost]动作来自不同控制器的

我在那里我呈现两个部分的观点是这样的布置图:

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

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

每个从登录控制这些行动只是呈现局部视图:

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

只是为了例证清单(两者都以相同方式构建),登录部分视图包含像这样的ajax表单:

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

从登录控制器(形式的目标)的登录动作具有以下属性签署(值得一提的,并注意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]属性签名的所有控制器(Login,RegisterController和CaptionExtendedController中的Index)被调用。

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

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

预先感谢您。

+0

我会为每个表单分配一个ID并像jQuery一样处理它们[here](http://stackoverflow.com/a/5410121/956051) – Lars

+0

前2个已经通过jQuery通过Ajax.BeginForm创建,但是我需要有第三个是正常的形式。另外,如果我这样做,这将意味着从现在开始,我的网站上的所有表单都应该使用Ajax.BeginForm或jquery完成,对吗?这听起来不像现在的选择。感谢您的时间。 – Edi

回答

0

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

+0

这是一个好主意。我无法从您的发布代码中看出另一个考虑因素:是否有可能关闭异步窗体的使用块失踪或错误放置?我猜不会,但如果你有<形式异步...><形式正常职位>可能解释它。 –

+0

谢谢大家。 Step by Step: @MichaelKennedy - open/close/using声明没有重叠;我也检查了HTML生成的文件,并且所有表单都完全打开和关闭。 – Edi

+0

Html.BeginForm的示例来自一个为测试而创建的简单页面,但始终我的所有Html.BeginForm或Ajax.BeginForm接收操作和控制器作为参数。 关于Html.RenderPartial而不是Html.Action - 我使用了后来的版本,因为我想为我的部分视图(登录和注册)自己的上下文和他们自己的模型;我知道我可以使用RenderPartial(这对登录是可以的)传递一个空的(新)模型,但是对于Register,我需要在它自己的控制器中填充一些数据(DDL等)。 – Edi

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; 
    }); 
}); 

我不知道它会工作,没有看到一切,但似乎是值得一试。

干杯, 迈克尔

+0

嗯...这让我想到另一个想法 - 把一些“断点”(控制台。日志)到这些表单的提交事件,但今天早些时候,我已经看了Fiddler中发生的事情,只有一个表单实际上提交... – Edi

+0

似乎我发现了一个类似的问题,但仍然没有回应... :(http:/ /stackoverflow.com/questions/11662852/submiting-one-form-posting-all-other-forms-in-the-page/15769866# – Edi

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的2个额外的参数 - 仍没什么...

WHY ????再次,为什么?我的意思是,我没有着急,它的固定的,但我不明白为什么它本身固定...

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

相关问题