ASP.Net MVC 请求视图模型不解析



我有这样的请求:

filter[logic]:and
filter[filters][0][value]:a
filter[filters][0][operator]:startswith
filter[filters][0][field]:result
filter[filters][0][ignoreCase]:true

我需要在控制器上接收它,但我不知道具体如何接收。我尝试过这个视图模型:

{
    public class SearchFilterViewModel
    {
        public string logic { get; set; }
        public List<SearchFilterFiltersViewModel> filters { get; set; }
    }
    public class SearchFilterFiltersViewModel
    {
        public string value { get; set; }
        //public string operator { get; set; }
        public string field { get; set; }
        public bool ignoreCase { get; set; }
    }
}

但控制器收到的所有内容均为空值。 operator属性被注释,因为运算符是一个保留关键字,我不知道如何 Asp.Net 使用它。我不知道这是否是问题的原因。

请注意,我无法更改请求正文模式,因为它来自此剑道小部件。

这是我的控制器(测试版):

public ActionResult Text(SearchFilterViewModel filter)
{
    return Json("", JsonRequestBehavior.AllowGet);
}

这是工作解决方案

型:

public class SearchFilterViewModel
{
    public string logic { get; set; }
    public List<SearchFilterFiltersViewModel> filter { get; set; }
}
public class SearchFilterFiltersViewModel
{
    public string value { get; set; }
    public string oper { get; set; }
    public string field { get; set; }
    public bool ignoreCase { get; set; }
}

然后,您可以编写自定义 IValueProvider,您可以在其中覆盖通常的解析机制,如下所示:

public class KendoValueProvider : NameValueCollectionValueProvider
{
    public KendoValueProvider(NameValueCollection originalCollection)
        : base(UpdateCollection(originalCollection), CultureInfo.InvariantCulture)
    {
    }
    private static NameValueCollection UpdateCollection(NameValueCollection collection)
    {
        NameValueCollection result = new NameValueCollection();
        foreach (string key in collection.Keys)
        {
            // ignore all other request
            if (!key.StartsWith("filter"))
                return null;
            var newKey = key
                .Replace("[filters]", string.Empty)
                .Replace("filter[logic]", "logic")
                .Replace("[value]", ".value")
                .Replace("[operator]", ".oper")
                .Replace("[field]", ".field")
                .Replace("[ignoreCase]", ".ignoreCase");
            var value = collection[key];
            result.Add(newKey, value);
        }
        return result;
    }
}

然后你需要编写 ValueProviderFactory,它将像这样注册这个 ValueProvider:

public class KendoValueProviderFactory : ValueProviderFactory
{
    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        return new KendoValueProvider(controllerContext.HttpContext.Request.QueryString);
    }
}

最后一步只是在 Global.asax 文件中注册它

ValueProviderFactories.Factories.Add(new KendoValueProviderFactory());

和示例操作

[HttpGet]
public ActionResult Index(SearchFilterViewModel model)
{
      return Json(model, JsonRequestBehavior.AllowGet);
}

最新更新