簡體   English   中英

ASP.NET MVC模型綁定不適用於AJAX GET,但適用於Post

[英]ASP.NET MVC Model binding doesn't work with AJAX GET but works with Post

我使用Jquery AJAX作為GET請求時遇到問題。 由於某種原因,ASP.NET MVC模型綁定器似乎無法綁定到我的過濾器項。 調用操作結果會發生什么,但會創建一個空對象。

但是,如果我從HTTP Get更改為HTTP Post,那么它可以工作。 那為什么會這樣? 根據我的理解,最好使用GET,因為服務器上的數據沒有變化。

這是我的代碼的精簡版:

AJAX:

$.ajax({
    url: url,
    contentType: 'application/json',
    dataType: 'json',            
    type: "GET",
    data: "{'filter':" + ko.toJSON(model.filter) + "}",
    error: function (xhr, textStatus, errorThrown) {

    },
    success: function (returnedData) {

    }

的ActionResult:

[HttpGet]
public virtual ActionResult Index(IFilter filter)
{
    ViewModel filteredViewModel = GetFilteredViewModel(filter);

    if (Request.IsAjaxRequest())
    {
        return toJSON(filteredViewModel );
    }

    return View(filteredViewModel );
}

過濾:

public class Filter: IFilter 
{    
   public Nullable<DateTime> LogDate { get; set; }        
   public Nullable<int> SpecificItem_ID { get; set; }
}

首先,為了解決誤解,POST並不一定意味着改變 由於缺少更好的單詞,在訪問“功能”時通過POST請求是完全有效的。 例如:

# Request
POST /add-xy
{ "x": 2, "y": 2 }

# Response
200 OK
4

沒有任何“改變”,但POST仍然是最合適的HTTP動詞。

也就是說,GET和POST請求之間存在根本區別,即POST“body”的概念。 POST主體可以具有內容類型,因此可以在服務器端正確解釋為JSON,XML等。使用GET,您只需要一個查詢字符串,它只是一個字符串。

您遇到的問題是,使用GET時,過濾器“object”只是一個字符串,並且由於字符串不實現IFilter因此模型綁定器無法綁定它。 但是,通過POST,過濾器“對象”將在POST正文中以適當的內容類型發送。 因此,modelbinder將其作為JSON接收,並將JSON對象映射到IFilter的實現。

道德觀點是,GET僅適用於簡單的請求 - 數據幾乎只是簡單類型的名稱 - 值對。 如果需要傳輸實際對象,則需要使用POST。

我不知道為什么會被接受,但目前接受的答案是完全錯誤的。

如果對象名稱是精確filter則ModelBinder不會綁定已發送的參數。 因此,更改對象的名稱,它將正確綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM