2014-10-01 59 views
2

我有一個KendoUI的代碼示例。方括號中的(屬性)參數

public ActionResult Customers_Read([DataSourceRequest]DataSourceRequest request) 
{ 
    return Json(GetCustomers().ToDataSourceResult(request)); 
} 

private static IEnumerable<CustomerViewModel> GetCustomers() 
{ 
    var northwind = new SampleEntities(); 
    return northwind.Customers.Select(
           customer => new CustomerViewModel 
           { 
            CustomerID = customer.CustomerID, 
            CompanyName = customer.CompanyName, 
            ContactName = customer.ContactName, 
            ... 
           }); 
} 

這個例子工作正常。

我感到困惑的Customers_Read方法[DataSourceRequest] ...

當我刪除(屬性?)[DataSourceRequest],從請求屬性爲空(NULL)......(他們不綁定) - >結果:過濾器不起作用..

什麼是[DataSourceRequest]?這就像屬性的屬性?

Code Example -> IndexController.cs 代碼示例

+0

我假設'DataSourceRequestAttribute'與這裏的'DataSourceRequest'不一樣。 – DavidG 2014-10-01 08:15:35

+0

請看我編輯的答案。 – 2014-10-01 08:57:55

回答

5

你們看到的是一個模型綁定屬性。 DataSourceRequest實際上是DataSourceRequestAttribute並且擴展了​​類。創建這樣的屬性是相當簡單:

首先,我們需要一個模型:

public class MyModel 
{ 
    public string MyProp1 { get; set; } 

    public string MyProp2 { get; set; } 
} 

我們需要能夠創建結合,通過創建一個自定義模型粘合劑。根據你的價值觀是如何發送到服務器,您可以通過表單中的值或者或查詢字符串:

public class MyModelBinder : IModelBinder 
{ 
    public object BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     MyModel model = new MyModel(); 

     //model.MyProp1 = controllerContext.HttpContext.Request.Form["MyProp1"]; 
     //model.MyProp2 = controllerContext.HttpContext.Request.Form["MyProp2"]; 
     //or 
     model.MyProp1 = controllerContext.HttpContext.Request.QueryString["MyProp1"]; 
     model.MyProp2 = controllerContext.HttpContext.Request.QueryString["MyProp2"]; 

     return model; 
    } 
} 

我們需要做的最後一件事是創建可在動作裏面設置模型綁定屬性結果簽名。其唯一目的是指定必須用它裝飾的參數模型綁定:

public class MyModelBinderAttribute : CustomModelBinderAttribute 
{ 
    public override IModelBinder GetBinder() 
    { 
      return new MyModelBinder(); 
    } 
} 

自定義綁定可以通過創建一個簡單的ActionResult,並在查詢字符串參數調用它(因爲我的實現進行測試上述查找在查詢字符串參數):

public ActionResult DoBinding([MyModelBinder]MyModel myModel) 
{ 
    return new EmptyResult(); 
} 

//inside the view 
<a href="/Home/DoBinding?MyProp1=value1&MyProp2=value2">Click to test</a> 

如DavidG指出的,DataSourceRequestAttributeDataSourceRequest不同。由於Attribute名稱約定,它們似乎具有相同的名稱,即DataSourceRequestAttribute在裝飾對象或屬性時丟失了Attribute部分。

作爲結論,DataSourceRequestAttribute只是告訴框架應該爲DataSourceRequest request參數使用自定義模型綁定器(可能是DataSourceRequestModelBinder或類似的東西)。

有關更多信息,請參閱以下鏈接:sourcesource

+0

啊,現在我明白了。感謝您提供非常詳細的答案! – 2014-10-01 09:20:50

+1

@EdiG。它也困擾了我一段時間。我做了一些小小的挖掘工作(包括在線和反編譯器),並被證明是一個漂亮的技巧。測試它並與之一起玩。 – 2014-10-01 09:24:52