括号中带有(attribute)的方法参数

Edi*_* G. 2 c# parameters asp.net-mvc arguments kendo-ui

我有一个来自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,
            // ...
        });
}
Run Code Online (Sandbox Code Playgroud)

这个例子工作正常.

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

当我删除(?属性?)时[DataSourceRequest],请求的属性为空(null)...(它们没有绑定) - >结果:过滤器不起作用..

那是什么[DataSourceRequest]?这就像属性属性?

代码示例 - > IndexController.cs 代码示例

And*_*i V 6

您所看到的是模型绑定器属性.该DataSourceRequest实际上是DataSourceRequestAttribute和扩展CustomModelBinderAttribute类.创建这样的属性非常简单:

首先我们需要一个模型:

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

    public string MyProp2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们需要能够通过创建自定义模型绑定器来创建绑定.根据您的值发送到服务器的方式,从表单或查询字符串中获取值:

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

我们需要做的最后一件事是创建模型绑定器属性,该属性可以在操作结果签名中设置.它的唯一目的是指定模型绑定器,它必须用于它装饰的参数:

public class MyModelBinderAttribute : CustomModelBinderAttribute
{
     public override IModelBinder GetBinder()
     {
          return new MyModelBinder();
     }
}
Run Code Online (Sandbox Code Playgroud)

可以通过创建一个简单的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>
Run Code Online (Sandbox Code Playgroud)

正如DavidG所说,DataSourceRequestAttribute不同于 DataSourceRequest.由于Attribute名称约定,它们似乎具有相同的名称,即在装饰对象或属性时DataSourceRequestAttribute丢失Attribute部件.

作为结论,DataSourceRequestAttribute只是告诉框架应该使用自定义模型绑定器(可能DataSourceRequestModelBinder或类似的东西)作为DataSourceRequest request参数.

有关其他信息,请参阅以下链接:来源,来源.