ASP.NET MVC的WebGrid无法正常传递电流参数,分页链接在特定情况下(ASP.NET M

2019-09-18 15:57发布

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=falseX=false&X=true

这是一个问题,因为X=false,true将无法正常进行绑定。 它会在模型​​绑定触发异常,动作的beggining之前。

有没有一种办法可以解决呢?

编辑:

这似乎是一个很具体的问题,但事实并非如此。 近一个复选框,每一个搜索形式将打破的WebGrid分页。 (如果您正在使用GET)

编辑2:

我想我只有2个选项:

  • 建立自己的WebGrid寻呼机是在传递参数分页链接更聪明
  • 建立自己的布尔模型绑定,理解false,true为有效

Answer 1:

如果别人从描述的问题的痛苦,你可以解决此使用这样的自定义模型粘合剂:

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);
    }
}


Answer 2:

从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)
{
    ...
}


Answer 3:

对于那些谁愿意落实丹的解决方案的定制模型绑定,但不知道如何。

你必须注册在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