WebGrid
的分页链接在所有情况下正常工作,除了一个(我注意到)。
当您使用CheckBoxFor
MVC中,它创建了一个input[type=hidden]
和input[type=check-box]
为同一字段,以便它可以处理状态。 所以,如果你有一个字段名为X
,并提交表单的GET
方法,您将最终像这样的网址:
http://foo.com?X=false&X=true
默认的模型粘合剂能够理解这些多个实例OS X
,并找出它的价值。
当您尝试在分页出现该问题WebGrid
。 它的行为是试图抓住当前请求参数和再经过他们在分页链接。 然而,由于有不止一个X
,它会通过X=false,true
而不是预期的X=false
或X=false&X=true
这是一个问题,因为X=false,true
将无法正常进行绑定。 它会在模型绑定触发异常,动作的beggining之前。
有没有一种办法可以解决呢?
编辑:
这似乎是一个很具体的问题,但事实并非如此。 近一个复选框,每一个搜索形式将打破的WebGrid分页。 (如果您正在使用GET)
编辑2:
我想我只有2个选项:
- 建立自己的WebGrid寻呼机是在传递参数分页链接更聪明
- 建立自己的布尔模型绑定,理解
false,true
为有效
如果别人从描述的问题的痛苦,你可以解决此使用这样的自定义模型粘合剂:
public class WebgridCheckboxWorkaroundModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.PropertyType == typeof (Boolean))
{
var value = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
if (value.AttemptedValue == "true,false")
{
PropertyInfo prop = bindingContext.Model.GetType().GetProperty(propertyDescriptor.Name, BindingFlags.Public | BindingFlags.Instance);
if (null != prop && prop.CanWrite)
{
prop.SetValue(bindingContext.Model, true, null);
}
return;
}
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
从DefaultModelBinder继承一个替代方案将是特别实现IModelBinder接口为空的布尔值。
internal class BooleanModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// Get the raw attempted value from the value provider using the ModelName
var param = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (param != null)
{
var value = param.AttemptedValue;
return value == "true,false";
}
return false;
}
}
然后,您可以添加模型结合在Global.asax或将其添加到像这样的参数:
public ActionResult GridRequests([ModelBinder(typeof(BooleanModelBinder))]bool? IsShowDenied, GridSortOptions sort, int? page)
{
...
}
对于那些谁愿意落实丹的解决方案的定制模型绑定,但不知道如何。
你必须注册在Global.asax文件模型绑定:
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(HomeViewModel), new WebgridCheckboxWorkaroundModelBinder());
}
还可以指定在动作的使用:
public ActionResult Index([ModelBinder(typeof(WebgridCheckboxWorkaroundModelBinder))] HomeViewModel viewModel)
{
//code here
return View(viewModel);
}
文章来源: ASP.NET MVC WebGrid is not properly passing current parameters to the pagination links in a particular situation