2013-05-09 13 views
1

我真的很好奇。是否有可能讓jQuery Ajax post操作將整個表單數據(不管是否序列化)發送到MVC 4方法,該方法具有與表單輸入ID相同名稱的特定參數,同時排除不匹配的元素?MVC 4 - jQuery Ajax發佈完整表單數據到特定方法

MVC 4控制器的方法

[HttpPost] 
public JsonResult DoWork(string companyName, string firstName, string lastName, string email) 
{ 
    //.. do stuff and return result... 
} 

HTML

<form id="MyForm" method="post"> 
    <input id="CompanyName" name="CompanyName" type="text"/> 
    <input id="FirstName" name="FirstName" type="text"/> 
    <input id="LastName" name="LastName" type="text"/> 
    <input id="Email" name="Email" type="text"/> 
    <input id="Var1" name="Var1" type="text"/> 
    <input id="Var2" name="Var2" type="text"/> 
</form> 

jQuery的阿賈克斯

$.ajax({ 
type: 'post', 
dataType: 'html', 
url: '/Controller/DoWork', 
data: $('#MyForm').serialize() 
}); 

如果這是不可能的開箱即用,沒有任何人有一些基本的想法,我可以研究如何做到這一點?我想讓別人知道我的方法調用而不給他們確切的參數名稱和值來讓這個方法有效。

+0

對於你所說的部分,你可能會更具體些:「排除做不匹配」? – 2013-05-09 03:32:07

+0

如果您在html中注意到有兩個名爲Var1和Var2的額外輸入。那些在調用控制器方法時不會被'處理',因爲沒有相同名稱的參數。 – David 2013-05-09 03:34:37

回答

1

是否有可能有一個jQuery的Ajax術後發送整個 表單數據,序列化與否,具有特定 參數具有相同名稱的形式輸入ID的MVC 4方法而排除 元素那不匹配?

是的,這是可能的。但是您記得您仍然可以通過Reques對象訪問這些發佈的數據。實際上,您可以刪除控制器方法中的所有參數,並且仍可以向其發佈數據。在控制器方法中擁有參數的真正好處是如果參數的類型是對象 - 視圖模型。具有數據註釋的視圖模型,因此您可以進行驗證。但請注意,這不是必需的,這只是一種技術。

另外一點需要注意的是,如果你有類似

public ActionResult DoWork(string first, string last, int id, int? id2) { 
} 

,你只能通過數據firstlast您的文章的行動將導致異常。該例外將在控制器期望收到值的id參數上。現在,如果您將值傳遞給first,lastid自變量,但省略了id2,則不會發生異常,因爲id2將具有空值。

因此,您發佈的示例將工作。如果您希望獲得它們的值,則可以通過執行Request["Var1"]Request["Var2"]來獲得Var1Var2的值。當然你可以忽略它們。

+0

我明白,在這種情況下,控制器方法不是視圖模型。但通過刪除參數,它使單元測試更像WebForms。我想保留參數名稱並將它們映射到發佈數據,最好不做任何事情。 – David 2013-05-09 03:41:51

+0

那麼問題是什麼呢?請再次閱讀我的答案,當您發表評論時,我可能會更新它。我引用了你的問題,我相信你就是這麼問的。你在問另一件事嗎?我誤解了你的問題的全部或部分內容嗎? – 2013-05-09 03:44:08

+0

我不想使用Request對象。在我的代碼示例中,ajax文章將失敗並顯示ajax錯誤。基本上我上面發佈的代碼不起作用。 – David 2013-05-09 03:54:35

0

呃我希望你沒有訴諸使用這裏接受的答案來做到這一點。這個問題實際上是重複的,而且這裏的答案是做你想做的事情的首選方式: Passing parameters when submitting a form via jQuery in ASP.NET MVC

+0

看起來非常像我一樣的東西。我會同意這個問題是重複的。但是,如果你認爲接受的答案是錯誤的,那麼請解釋它爲什麼是錯的,以及爲什麼你的答案是更好的做法。 – David 2013-08-09 01:34:11

+0

你當然是對的,我沒有說明一個理由被接受的答案的真正問題是,它迫使你手動做所有的模型綁定,類型轉換,並且失敗了MVC的目的。只需接收模型,一個額外的參數,並讓MVC模型綁定器爲您完成所有工作......始終始終爭取乾淨的代碼。 – 2013-08-09 08:00:47