2011-12-26 23 views
0

我在我的RESTful應用程序這個動作上MVC3:建設行動參數對象

[HttpPut] 
public void Rest(ViewModel view_model, int id) 
{ 
    //doing something with view_model 
} 

哪裏ViewModel類是一類來自客戶端的JavaScript將數據傳遞到/(我`噸想通過純DB實體):

public class ViewModel 
{ 
    public ViewModel() //parameterless constructor, needed for accepting as parameter in action 
    { 
    } 

    public ViewModel(Model m) 
    { 
     id = m.ID; 
     Title = m.Title; 
    } 

    public int? id { get; set; } 

    private string _title; 
    public string Title 
    { 
     get 
     { 
      if (String.IsNullOrWhiteSpace(_title)) throw new Exception("Empty field"); 
      return _title; 
     } 
     set 
     { 
      _title = value; 
     } 
    } 
} 

但是當我做與數據PUT請求:

{ "id" : 7, "Title" : "Hello world!" } 

我得到那個「空場」異常。看起來似乎是試圖得到 Title屬性,甚至之前就已經設置與進入「世界,你好!」數據。 爲什麼?

我在哪裏可以獲得一些信息,在實際的XHR請求中,整個操作如何工作,即查找指定爲操作參數的對象ViewModel

謝謝你的想法。

回答

1

好像有些東西想要獲得Title屬性,甚至在它已被設置爲傳入「Hello world!」之前 。數據。爲什麼?

這是默認的模型聯編程序。更具體地說是BindProperty方法。這個方法在綁定過程中被調用,它使用反射來調用getter。因爲模型綁定器向下遞歸對象層次結構圖,它首先需要獲取該屬性的值,爲每個屬性構建一個綁定上下文和模型元數據,然後調用SetProperty方法。

如果你不想要的標題屬性爲空使用驗證機制和自動實現的屬性:

[Required] 
public string Title { get; set; } 

,然後在你的RESTful操作檢查ModelState.IsValid。這是更容易和MVCish:

[HttpPut] 
public ActionResult Rest(ViewModel view_model, int id) 
{ 
    if (!ModelState.IsValid) 
    { 
     ... 
    } 

    // doing something with view_model 
    ... 
} 
+0

非常感謝您! – Roman