2012-05-10 102 views
0

我尋找了很長時間來解決這個問題,但是我找不到任何東西。我已經將強類型定義爲我正在使用的控制器/視圖的模型;問題在於模型引用了其他複雜類型,所以我需要部分更新該模型的各個部分。例如,在頁面的一個選項卡中,我會部分地看到另一個視圖,它爲網格帶來了一些選擇;另一部分帶來另一部分;所以在用戶選擇他們的選項並提交之後,我需要將所有這些小片段發送到後期操作。如何將Model和json對象傳遞給控制器​​操作

我已經創建了我需要的JSON對象並將它發送給控制器。在行動中,我成功地獲得了模型,但JSON並沒有採取行動。那麼,如何將該JSON傳遞給視圖作爲控制器操作的附加參數?

我也已經使用fiddler檢查了請求併發送了JSON。對象是否通過特殊集合傳遞?


當然可以。該視圖預期或強制鍵入模型,在這種情況下是「提供者」實體。該實體具有原始類型和複雜類型。即使實體仍處於創建過程中,當達到創建後操作時,我需要傳遞部分對象來完成實體。該模型的 下面有一部分:

public class Provider2 : IProvider 
{ 
    public int Id { get; set; } 
    public bool IsApproved { get; set; } 
    public string RejectionNotes { get; set; } 
    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string Fax { get; set; } 
    public string Email { get; set; } 
    public int OfficeAddressId { get; set; } 
    public virtual Address Address { get; set; } 
    public virtual ICollection<Chain> ProviderChain { get; set; } 
    public virtual ICollection<ProviderContact> ProviderContacts { get; set; } 
    public virtual ICollection<ExaminationPrice> ExaminationPrices { get; set; } 
} 

存在與簡單類型沒有問題,如整數,字符串等。 正如你所看到的,有集合和複雜的類型,這些類型是從部分視圖中檢索的,那一刻是獨立的實體,所以我需要在提交時將它們包裝在JSON或另一個對象(如JSON)中並獲取它在所達成的創建行動的時刻:

[HttpPost] 
public ActionResult Create(Provider provider, Another object to be passed???) 
{ 
    if (ModelState.IsValid) 
    { 
     _repository.Save(provider); 
     return RedirectToAction("Index"); 
    } 
    return View(provider); 
} 

的基本類型和屬性在模型映射,所以他們都沒有問題,但藏品沒有被映射,因此多數民衆贊成的理由讓我的ADDRES試圖傳遞一個像json這樣的aditional對象來將所有的部分從純HTML包裝到javascript對象,因爲它們不會直接映射到模型。

所以,通過這個JavaScript即時通訊發送我需要的數據視圖和它的發送,但顯然行動沒有收到json對象。

$(function() { 
     $("#ButtonSave").click(function() { 
      var prices = getPrices(); 

      if (prices != null) { 
       $.ajax({ 
        url: '/Provider/Create', 
        type: 'POST', 
        dataType: 'json', 
        data: prices, 
        contentType: 'application/json; charset=utf-8', 
        success: function (data) { 
         alert('Success'); 
        } 
       }); 
      } 
     }); 
    }); 

    function getPrices() { 
     var elements = '[';   
     var rows = $("#selectedElementsGrid tr.selectable").each(function() { 
      var idValue = '{price : { "Id":' + $(this).find(".id").val() + ','; 
      var nameValue = ' "Name":"' + $(this).find(".name").text() + '",'; 
      var priceValue = ' "Price":"' + $(this).find(".price").val() + '"} },'; 
      elements = elements + idValue + nameValue + priceValue; 
     }); 
     elements = elements.substring(0, elements.length - 1) + ']'; 
     return JSON.stringify(elements); 
    } 

在此先感謝!

+0

我看了你的問題3次,仍然不明白你在問什麼。你能提供你的代碼的相關部分來幫助說明嗎? – McGarnagle

+0

當然。該視圖預期或強制鍵入模型,在這種情況下是「提供者」實體。這個實體具有原始類型和複雜類型: – Charles

+1

讓我改述。 **在行動中,我成功地獲得了模型,但是JSON並沒有發揮作用。**如果您已經擁有該模型,爲什麼需要JSON? – McGarnagle

回答

0

陷了很多關於MVC3框架我發現,你可以通過許多參數你想要一個控制器動作,關鍵是要保持模型和請求的良好處理。 此外,我發現thath最簡單的方法來實現這一目標是通過JSON,首先你與你所需要的參數定義你的控制器動作:

[HttpPost] 
public ActionResult AddContact(Contact contact, int Id) 
{ 
    var globalType = _repository.FindOne(p => p.Id == Id); 
    if (globalType.Contacts == null) 
    { 
     globalType.Contacts = new List<Contact>(); 
    } 
    globalType.Contacts.Add(contact); 
    return View("Index", globalType); 
} 
從標記

然後定義一個複雜的JSON,將傳遞參數:

var contact = { Id: $('#FieldId').val(), 
      Notes: $('#ContactNotes').val(), 
      Name: $('#ContactName').val(), 
      Phone: $('#Phone').val(), 
      Fax: $('#Fax').val(), 
      Email: $('#Email').val(), 
      OfficeAddress: { Country: $('#Country').val(), 
        State: $('#State').val() 
        ZipCode: $('#ZipCode').val() 
      } 
     };         

    $.ajax({ 
     url: '/Contact/Edit', 
     contentType: 'application/json; charset=utf-8', 
     type: 'POST', 
     dataType: 'json', 
     data: JSON.stringify(contact) 
    }) 
    .success(function (result) { 
     // Display the section contents. 
     alert('Contact updated succesfully!'); 
     window.location.href = result.Url; 
    }) 
    .error(function (xhr, status) { 
     alert('The provider could not be updated.'); 
    }); 

請注意,Id參數的調用方式與操作方法中的相同。複雜類型是由MVC框架自動引發的,唯一的條件是屬性必須命名相同。

實現相同結果的另一種方法是使用2種不同的JSON類型定義控制器操作,這是一個示例。

控制器動作:

[HttpPost] 
public ActionResult AddContact(TypeA typeA, TypeB typeB) 
{ 
    //Some logic... 
} 

JSON:

var _typeA = { Id: $('#FieldId').val(), 
      Name: $('#ContactName').val() 
     }; 

    var _typeB = { Id: $('#FieldId').val(), 
      Name: $('#ContactName').val() 
     }; 

    $.ajax({ 
     url: '/Controller/Action', 
     contentType: 'application/json; charset=utf-8', 
     type: 'POST', 
     dataType: 'json', 
     data: {typeA:JSON.stringify(_typeA)},{typeB:JSON.stringify(_typeB)} 
    }) 
    .success(function (result) { 
     // Display the section contents. 
     alert('Contact updated succesfully!'); 
     window.location.href = result.Url; 
    }) 
    .error(function (xhr, status) { 
     alert('The provider could not be updated.'); 
    }); 

希望這有助於你

+0

在RouteDictionary上配置路由以便MVC正確解析根據參數使用的正確控制器很重要。 – Charles

0

您發佈的json對象是字符串(您可以稍後使用JavaScriptSerializer的方法進行反序列化)。 我認爲,你缺少的是價格變量的關鍵,你把它當作jquery ajax調用中的數據。 一個帖子通常由一個關鍵值對列表組成,這也允許服務器技術人員從發佈的數據中重建和反對。在你的情況下,只有價格varibale。
嘗試將其更改爲數據:{PricesListAsString:prices},並在服務器上將「要傳遞的另一個對象」更改爲字符串PricesListAsString。
當然,你也可以檢查Request對象,而控制器調試,看到張貼的值是如何傳遞給服務器

相關問題