2013-05-13 78 views
2

我有一個局部視圖。它的型號是一本書的對象和客戶對象HTML.BeginForm不會調用控制器asp.net MVC 4

我試圖用一個輸入類型=用下面的提交按鈕:

@using (Html.BeginForm("GetBooks", "Home", FormMethod.Post, new { id = "formId" })) 
{ 

} 

我可以獲取用戶輸入的值與var values = $('#formId').serialize();

但當點擊按鈕時,控制器不會被調用。

所以,我決定使用jquery ajax()方法,它似乎工作正常,通過調用控制器並傳入模型。但是,它不會將更新的模型(用用戶輸入更新)發送到控制器。 AJAX的

例如:

$.ajax({   
      url: "/Home/GetBooks", 
      data: JSON.stringify({ model: @Html.Raw(Json.Encode(Model)) }) , 
      type: 'POST', 
      contentType: 'application/json', 

      beforeSend:function(){ 
       $("#loading").show(); 
      }, 
      success: function(data) {  
       append(data) 
      }, 
      error: function (e, textStatus, jqXHR) { 
       $("#loading").hide(); 
       alert(e.statusText); 
      },   
      complete:function(){    
       $("#loading").hide(); 
      } 

     }); 

我需要重新分配用戶輸入的值到Book模型之前我叫Ajax的方法,但是我不確定如何做到這一點。我傳遞這兩個圖書和用戶模型回控制器作爲

JSON.stringify({model: @Html.Raw(Json.Encode(Model))}) 

控制器看出:

[HttpPost] 
public ActionResult GetBooks(ModelObjects model) 
{ 

} 

型號:在查看

public class ModelObjects 
    { 
     public MVC4App.Models.Customer Customer{ get; set; } 
     public MVC4App.Models.Book Book{ get; set; } 
    } 

public class Customer 
    { 
     public string FirstName{ get; set; } 
     public string LastName{ get; set; } 

    } 

public class Book 
    { 
     public string Name{ get; set; } 
    } 

模型參考:

@model MVC4App.Models.ModelObjects 

謝謝 提前!

回答

1

您使用Ajax方式在做什麼是正確的差不多,除了

data: JSON.stringify({ model: @Html.Raw(Json.Encode(Model)) }) 

這將會導致一個硬編碼的json,你繼續回發。事情是,@Html.Raw(Json.Encode(Model))將是一個字符串生成服務器端,當渲染視圖(只要看看網頁的來源)。

所以,改變

url: "/Home/GetBooks", 
data: JSON.stringify({ model: @Html.Raw(Json.Encode(Model)) }) , 
type: 'POST', 
contentType: 'application/json', 

類似像什麼:

url: "/Home/GetBooks", 
data: $('#formId').serialize(), // or JSON.stringify($('#formId').serialize()) 
type: 'POST', 
contentType: 'application/json', 

然後你會被張貼該使用者輸入值。

+0

這仍然不能解釋爲什麼輸入按鈕不起作用,但爲此,您需要用視圖和控制器操作中使用的模型來更新問題。 – 2013-05-13 18:26:13

+0

是的,我有:var values = $('#formId')。serialize();有沒有一種方法可以在Jquery中使用它來更新模型,其效果如下:@Model.Customer = values; 這樣,當我發送:JSON.stringify({model:@ Html.Raw(Json.Encode(Model))}),它將被更新爲正確的值。 – alpha 2013-05-13 18:47:25

+0

@alpha,我已經更新了答案,因此它更好地解釋了要做什麼。 – 2013-05-13 18:53:20

0

安裝Fiddler(http://fiddler2.com/get-fiddler),看看您點擊提交按鈕時是否有請求。如果沒有,那麼你有客戶端問題,例如你的提交按鈕超出了你使用的BeginForm語句。

如果正在提出請求,那麼您需要查看您的控制器操作路由以及它是否正確。還要確保您的操作使用HttpPost屬性進行修飾,並且它接受適當的模型參數。你能在這裏發佈你的控制器動作代碼嗎?

在任何情況下小提琴手是你最好的朋友,它會告訴你什麼是失敗,在那裏...

+0

嗨,是的,我確實有模型參數的HttpPost屬性和使用的提琴手和控制器沒有被調用(請求未作出) – alpha 2013-05-13 17:47:57

+0

您的提交按鈕內使用BeginForm語句?你有任何javascript/jquery代碼覆蓋提交按鈕的行爲,它不執行提交? – Marko 2013-05-13 17:53:07

+0

按鈕是在開始表單和我的輸入按鈕: alpha 2013-05-13 17:55:24

0

我們知道.BeginForm()擴展方法將創建一個表單標記,從而將表單級方法關聯到頁面。我一直在想,MVC3中的Html.BeginForm()和Ajax.BeginForm()方法究竟有什麼區別。閱讀許多博客,每個人都只說一件事,在Ajax表單中,表單是使用Javascript異步提交的。所以,這篇文章是爲了驗證同樣的事情。 http://www.codeproject.com/Articles/429164/Html-BeginForm-vs-Ajax-BeginForm-in-MVC3

相關問題