2013-04-02 18 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 ????再次,爲什麼?我的意思是,我沒有着急,它的固定的,但我不明白爲什麼它本身固定...

謝謝所有您的時間和評論/答案。

相關問題