我的控制器中有一个方法(SurfaceController是一个特定的Umbraco控制器):
public class ProductListController : SurfaceController
{
public ActionResult GetCategoryProducts([ModelBinder(typeof(IntArrayModelBinder))] int[] categoryIds, int page = 1, int pageSize = 10)
{
int total = 0;
var products = ProductService.GetCategoryProducts(categoryIds, page, pageSize, out total);
return View("/Views/PartialView/ProductList.cshtml", products);
}
}
然后我有了以下的ModelBinder,所以我可以创建像"?categoryIds = 1,2,3,4,5"而不是默认行为"?categoryIds = 1& categoryIds = 2& categoryIds = 3& categoryIds = 4& categoryIds = 5"。
public class IntArrayModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (value == null || string.IsNullOrEmpty(value.AttemptedValue))
{
return null;
}
return value
.AttemptedValue
.Split(',')
.Select(int.Parse)
.ToArray();
}
}
这也意味着当我将int []作为参数发送到RenderAction时它不起作用,但是当将值连接到逗号分隔的字符串时它可以工作。
@{ Html.RenderAction("GetCategoryProducts", "ProductList", new { categoryIds = new int[] { 1, 2, 3, 4, 5 }, pageSize = 50 }); }
@{ Html.RenderAction("GetCategoryProducts", "ProductList", new { categoryIds = string.Join(",", new int[] { 1, 2, 3, 4, 5 }), pageSize = 50 }); }
除了更改" categoryIds"将GetCategoryProducts中的参数转换为字符串,然后在此方法中将字符串拆分为int数组。
我想如果我可以保留签名的GetCategoryProducts方法。