图书馆jQuery的数据表ASP.NET MVC [英] Library For JQuery DataTables ASP.NET MVC

查看:135
本文介绍了图书馆jQuery的数据表ASP.NET MVC的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的ASP.NET MVC 5项目使用jQuery数据表。

我没有实际使用的数据表及其工作完全正常,但问题是,我不得不手动设置过滤器和查询,我有一种感觉的方式,我想实现MVC中的数据表是不完全正确。
是的,我做得到的结果,但我想跟进和标准,再加上我想要的东西,我没有到C连连输入滤波器和分页$ C $,我只将参数传递给一些函数或类和我得到的结果

这就是为什么我试图寻找一些数据表库正确的文件。

由于我碰到这个图书馆来了。

  https://github.com/ALMMa/datatables.mvc

但没有好的文档,我可以了解什么是真正的在库发生或如何使用该库?

是的,我试过,图书馆,但由于缺乏C#和asp.net知识,我不知道如何来实现它,我不能找到有关这个库,我能理解这个库的工作的例子。

不过我也偶然发现了这个好文件的过程。

<$p$p><$c$c>http://www.$c$cproject.com/Articles/155422/jQuery-DataTables-and-ASP-NET-MVC-Integration-Part

,因为它们提供了如何实现一个很好的详细解释它没有伟大的工作。

我做我的控制器code事情是这样的。

 公众的ActionResult指数(jQueryDataTableParamModel参数= NULL)
        {
            如果(Request.IsAjaxRequest()及&放大器; PARAM!= NULL)
            {                变种allCategories = _db.Categories.ToList();
                IEnumerable的&LT;类别及GT;类别;
                VAR sortColumnIndex = Convert.ToInt32(请求[iSortCol_0]);
                VAR sortDirection =请求[sSortDir_0]; // ASC或DESC
                FUNC&LT;类别,串&GT; ?orderingFunction =(C =&GT; sortColumnIndex == 1 c.Name:
                    sortColumnIndex == 2? c.SortOrder.ToString():c.Status.ToString());                如果(!string.IsNullOrEmpty(param.sSearch))
                {
                    如果(sortDirection ==降序){
                    类=(从allCategories类别
                                  其中,category.Name.ToLower()。包含(param.sSearch.ToLower())
                                  选择类别).OrderByDescending(orderingFunction).Skip(param.iDisplayStart)。取(param.iDisplayLength);
                        }
                    其他
                    {
                        类=(从allCategories类别
                                      其中,category.Name.ToLower()。包含(param.sSearch.ToLower())
                                      选择类别).OrderBy(orderingFunction).Skip(param.iDisplayStart)。取(param.iDisplayLength);
                    }
                }
                其他
                {
                    如果(sortDirection ==降序){
                    类=(从allCategories类别
                                  选择类别).OrderByDescending(orderingFunction).Skip(param.iDisplayStart)。取(param.iDisplayLength);
                    }
                    其他{
                        类=(从allCategories类别
                                      选择类别).OrderBy(orderingFunction).Skip(param.iDisplayStart)。取(param.iDisplayLength);
                    }
                }
                VAR actionButtons =&LT; D​​IV CLASS ='BTN-组'&GT;+
                    &LT;按钮类='BTN BTN-主要BTN梯度BTN-SM型=按钮&gt;中+
                    &LT;跨度类='发发铅笔'&GT;&LT; / SPAN&gt;中+
                    &LT; /按钮&gt;中;
                返回JSON(新
                {
                    sEcho = param.sEcho,
                    iTotalRecords = categories.Count(),
                    iTotalDisplayRecords = categories.Count(),
                    aaData =(从类别中的类别
                              选择新的[] {category.CategoryID.ToString(),category.Name,category.SortOrder.ToString(),actionButtons})。ToArray的()
                },
                                JsonRequestBehavior.AllowGet);
            }            返回查看();
        }

但是当你看到有很多code在短短1的方法,现在如果有对数据表中更多的方法,我会为C连连写的所有$ C $。这样反而是有可能我做出某种共同的DataTable类或函数,并提供一些参数调用它,我得到了想要的结果。

我在ASP.NET MVC5或C#没经验,其过一些日子我对MVC 5.工作因此,如果有什么achiving我在我的code在这里实现结果的任何更好的方法,请分享太,你认为你想到的任何建议应该对我来说是很好的关于数据表。


解决方案

我使用的是自定义模型粘合剂和JsonConverter(对于JSON.NET):

一个包含模型数据表请求的例子:

 公共类为MyModel
{
   [JsonConverter(typeof运算(DataTableConverter))]
   公共DataTableRequest DataTableRequest {搞定;组; }
   //其他属性
}

则动作方法如下:

  [HttpPost]
公共虚拟的ActionResult GetDataTableData(为MyModel基于myModel)
{
}

数据表DataTableRequest类。该GetOrderByEx pression回报动态的LINQ 前pression:

 公共类DataTableRequest
{
    公众诠释的PageIndex {搞定;私人集; }
    公众诠释每页{搞定;私人集; }
    公共字符串搜索{搞定;私人集; }
    私人列表&LT; SortBy&GT; SortingColumns {搞定;组; }    公众诠释SEcho {搞定;私人集; }    公共DataTableRequest(INT的PageIndex,诠释的pageSize,字符串搜索,列表&LT; SortBy&GT; sortingColumns,诠释sEcho)
    {
        的PageIndex = PageIndex的;
        每页= pageSize的;
        搜索=搜索;
        SortingColumns = sortingColumns;
        SEcho = sEcho;
    }    公共字符串GetOrderByEx pression()
    {
        //可以传递给用的EntityFramework就像DynamicLinq query.OrderBy(dataTableRequest.GetOrderByEx pression())
        变种columnDirectionPairs = SortingColumns.Select(C =&gt;中。Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(c.Column.Replace(_))++ c.Direction);
        变种orderByEx pression =的string.join(,,columnDirectionPairs);
        返回orderByEx pression;
    }    公共类SortBy
    {
        公共SortBy(字符串列,串方向)
        {
            Guard.ArgumentNotNullOrEmpty(列,列);
            Guard.ArgumentNotNullOrEmpty(方向方向);            柱=柱;
            方向=方向
        }        公共字符串列{搞定;组; }
        公共字符串方向{搞定;组; }
    }
}

数据表转换器(用于序列到JSON):

 公共类DataTableConverter:JsonConverter
{
    公众覆盖布尔CanConvert(类型的objectType)
    {
        返回的objectType == typeof运算(DataTableRequest);
    }    公众覆盖对象ReadJson(JsonReader读者,类型的objectType,对象existingValue,JsonSerializer串行)
    {
        VAR jArray = JArray.Load(读卡器);        VAR tableValueCollection = jArray.Select(X =&gt;新建{名称= X [名称]值&LT;串&GT;(),值= X [值]值&LT;串&GT;()})。ToDictionary(X =&GT; x.Name中,x =&GT; x.Value);        VAR numberOfColumns = int.Parse(tableValueCollection [iColumns],CultureInfo.InvariantCulture);        VAR列=新的List&LT;串GT;();        的for(int i = 0; I&LT; numberOfColumns;我++)
        {
            VAR queryParamName =的String.Format(mDataProp_ {0},i.ToString(CultureInfo.InvariantCulture));
            columns.Add(tableValueCollection [queryParamName]);
        }        VAR numberOfSortingColumns = int.Parse(tableValueCollection [iSortingCols],CultureInfo.InvariantCulture);
        VAR sortingColumns =新的List&LT; D​​ataTableRequest.SortBy&GT;();
        的for(int i = 0; I&LT; numberOfSortingColumns;我++)
        {
            VAR sortColQueryParamName =的String.Format(iSortCol_ {0},i.ToString(CultureInfo.InvariantCulture));            如果(tableValueCollection [sortColQueryParamName]!= NULL)
            {
                VAR sortDirQueryParamName =的String.Format(sSortDir_ {0},i.ToString(CultureInfo.InvariantCulture));
                VAR sortingDirection = tableValueCollection [sortDirQueryParamName]                VAR sortingColumnIndex = int.Parse(tableValueCollection [sortColQueryParamName],CultureInfo.InvariantCulture);
                VAR sortingColumnName =列[sortingColumnIndex]                sortingColumns.Add(新DataTableRequest.SortBy(sortingColumnName,sortingDirection));
            }
        }        VAR displayStart = int.Parse(tableValueCollection [iDisplayStart],CultureInfo.InvariantCulture);
        VAR displayLength = int.Parse(tableValueCollection [iDisplayLength],CultureInfo.InvariantCulture);
        VAR的pageSize = displayLength;
        VAR的PageIndex = displayStart / displayLength;        字符串搜索= NULL;        如果(tableValueCollection.ContainsKey(SSEARCH))
        {
            搜索= tableValueCollection [SSEARCH];
        }        VAR sEcho = int.Parse(tableValueCollection [sEcho],CultureInfo.InvariantCulture);        VAR dataTableRequest =新DataTableRequest(PageIndex的,pageSize的,搜索,sortingColumns,sEcho);        返回dataTableRequest;
    }    公共覆盖无效WriteJson(JsonWriter作家,对象的值,JsonSerializer串行)
    {
        抛出新NotImplementedException();
    }
}

DataTableModelBinder用于反序列化对象DataTableRequest:

 公共类DataTableModelBinder:DefaultModelBinder
{
    公众覆盖对象BindModel(ControllerContext controllerContext,ModelBindingContext的BindingContext)
    {
        VAR请求= controllerContext.HttpContext.Request;
        VAR的contentType = request.ContentType;
        如果(!contentType.StartsWith(应用/ JSON,StringComparison.OrdinalIgnoreCase))
            回报(NULL);        request.InputStream.Seek(0,SeekOrigin.Begin);
        VAR bodyText的=新的StreamReader(request.InputStream).ReadToEnd();        如果(string.IsNullOrEmpty(bodyText的))回报(NULL);        VAR jsonObj = JObject.Parse(bodyText的);
        VAR jArray =(JArray)jsonObj [aoData];        VAR tableValueCollection = jArray.Select(X =&gt;新建{名称= X [名称]值&LT;串&GT;(),值= X [值]值&LT;串&GT;()})。ToDictionary(X =&GT; x.Name中,x =&GT; x.Value);        VAR numberOfColumns = int.Parse(tableValueCollection [iColumns],CultureInfo.InvariantCulture);        VAR列=新的List&LT;串GT;();        的for(int i = 0; I&LT; numberOfColumns;我++)
        {
            VAR queryParamName =的String.Format(mDataProp_ {0},i.ToString(CultureInfo.InvariantCulture));
            columns.Add(tableValueCollection [queryParamName]);
        }        VAR numberOfSortingColumns = int.Parse(tableValueCollection [iSortingCols],CultureInfo.InvariantCulture);
        VAR sortingColumns =新的List&LT; D​​ataTableRequest.SortBy&GT;();
        的for(int i = 0; I&LT; numberOfSortingColumns;我++)
        {
            VAR sortColQueryParamName =的String.Format(iSortCol_ {0},i.ToString(CultureInfo.InvariantCulture));            如果(tableValueCollection [sortColQueryParamName]!= NULL)
            {
                VAR sortDirQueryParamName =的String.Format(sSortDir_ {0},i.ToString(CultureInfo.InvariantCulture));
                VAR sortingDirection = tableValueCollection [sortDirQueryParamName]                VAR sortingColumnIndex = int.Parse(tableValueCollection [sortColQueryParamName],CultureInfo.InvariantCulture);
                VAR sortingColumnName =列[sortingColumnIndex]                sortingColumns.Add(新DataTableRequest.SortBy(sortingColumnName,sortingDirection));
            }
        }        VAR displayStart = int.Parse(tableValueCollection [iDisplayStart],CultureInfo.InvariantCulture);
        VAR displayLength = int.Parse(tableValueCollection [iDisplayLength],CultureInfo.InvariantCulture);
        VAR的pageSize = displayLength;
        VAR的PageIndex = displayStart / displayLength;        字符串搜索= NULL;        如果(tableValueCollection.ContainsKey(SSEARCH))
        {
            搜索= tableValueCollection [SSEARCH];
        }        VAR sEcho = int.Parse(tableValueCollection [sEcho],CultureInfo.InvariantCulture);        VAR dataTableRequest =新DataTableRequest(PageIndex的,pageSize的,搜索,sortingColumns,sEcho);        返回dataTableRequest;
    }
}

在Global.asax.cs中上的Application_Start寄存器模型绑定:

  ModelBinders.Binders.Add(typeof运算(DataTableRequest),新DataTableModelBinder());

我使用的数据表1.9.4及以下JSON模型绑定:

 公共类JsonModelBinder:DefaultModelBinder
{
    公共静态JsonSerializerSettings GlobalSerializerSettings
    {
        得到
        {
            返回新JsonSerializerSettings()
            {
                ContractResolver =新CamelCasePropertyNamesContractResolver()
                转换器= {新IsoDateTimeConverter()}
            };
        }
    }    公众覆盖对象BindModel(ControllerContext controllerContext,ModelBindingContext的BindingContext)
    {
        如果(!IsJSONRequest(controllerContext))
        {
            返回base.BindModel(controllerContext,BindingContext中);
        }
        //获取一个已经张贴的JSON数据
        VAR请求= controllerContext.HttpContext.Request;        request.InputStream.Seek(0,SeekOrigin.Begin);
        VAR的StreamReader =新的StreamReader(request.InputStream);
        变种jsonStringData = streamReader.ReadToEnd();        如果(string.IsNullOrEmpty(jsonStringData))
            返回null;        返回JsonConvert.DeserializeObject(jsonStringData,bindingContext.ModelMetadata.ModelType,GlobalSerializerSettings);
    }    保护静态布尔IsJSONRequest(ControllerContext controllerContext)
    {
        VAR的contentType = controllerContext.HttpContext.Request.ContentType;
        返回contentType.Contains(应用/ JSON);
    }
}

替换默认的模型绑定:

  ModelBinders.Binders.DefaultBinder =新JsonModelBinder();

i want to use jQuery DataTables in my ASP.NET MVC 5 Project.

I did actually used the datatable and its working perfectly fine, but problem is i had to manually set the filter and queries, and i have a feeling the way i am trying to implement the datatables in mvc is not quite right. Yes i do get the results but i want to follow and standards plus i want something that i do not have to type the filter and pagination code again and again, i only send parameters to some function or class and i get the result.

This is why i am trying to look for some datatables library with proper documentation.

As i came across this library.

https://github.com/ALMMa/datatables.mvc

but there is no good documentation that i could understand what really is happening in that library or how to use that library?

Yes i tried that library but due to lack of knowledge of c# and asp.net i don't understand how to implement it and i cant find any example related to this library to which i could understand the working of this library..

however i also stumbled across this good documented process.

http://www.codeproject.com/Articles/155422/jQuery-DataTables-and-ASP-NET-MVC-Integration-Part

It did worked great as they provided a very good detailed explanation of how to implement.

I made my Controller Code Something like this.

public ActionResult Index(jQueryDataTableParamModel param = null)
        {
            if (Request.IsAjaxRequest() && param != null)
            {

                var allCategories = _db.Categories.ToList();
                IEnumerable<Category> categories;
                var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]);
                var sortDirection = Request["sSortDir_0"]; // asc or desc
                Func<Category,string> orderingFunction = (c => sortColumnIndex==1? c.Name :
                    sortColumnIndex==2? c.SortOrder.ToString(): c.Status.ToString());

                if (!string.IsNullOrEmpty(param.sSearch))
                {
                    if(sortDirection == "desc"){
                    categories = (from category in allCategories
                                  where category.Name.ToLower().Contains(param.sSearch.ToLower())
                                  select category).OrderByDescending(orderingFunction).Skip(param.iDisplayStart).Take(param.iDisplayLength);
                        }
                    else
                    {
                        categories = (from category in allCategories
                                      where category.Name.ToLower().Contains(param.sSearch.ToLower())
                                      select category).OrderBy(orderingFunction).Skip(param.iDisplayStart).Take(param.iDisplayLength);
                    }
                }
                else
                {
                    if (sortDirection == "desc") { 
                    categories = (from category in allCategories
                                  select category).OrderByDescending(orderingFunction).Skip(param.iDisplayStart).Take(param.iDisplayLength);
                    }
                    else{
                        categories = (from category in allCategories
                                      select category).OrderBy(orderingFunction).Skip(param.iDisplayStart).Take(param.iDisplayLength);
                    }
                }
                var actionButtons = "<div class='btn-group'>"+
                    "<button class='btn btn-primary btn-gradient btn-sm' type='button'>"+
                    "<span class='fa fa-pencil'></span>"+
                    "</button>";
                return Json(new
                {
                    sEcho = param.sEcho,
                    iTotalRecords = categories.Count(),
                    iTotalDisplayRecords = categories.Count(),
                    aaData = (from category in categories
                              select new[] { category.CategoryID.ToString(), category.Name, category.SortOrder.ToString(), actionButtons }).ToArray()
                },
                                JsonRequestBehavior.AllowGet);
            }

            return View();
        }

But as you see there is alot of code in just 1 method now if there are more methods for the datatable, i will have to write all the code again and again. so instead is it possible i make some kind of common datatables class or function and call it by providing some parameters and i get the desired result.

I have no experience in ASP.NET MVC5 or C# ,its been some days i am working on MVC 5. So if there are any better ways of achiving the results what i have implemented here in my code please share that too and any suggestion you think you think should be nice for me regarding the datatables.

解决方案

I'm using a custom model binder and JsonConverter (for JSON.NET):

Example of a model containing data table request:

public class MyModel
{
   [JsonConverter(typeof(DataTableConverter))]
   public DataTableRequest DataTableRequest { get; set; }
   // other properties 
}

then the action method will look like:

[HttpPost] 
public virtual ActionResult GetDataTableData(MyModel myModel)
{
}

the data table DataTableRequest class. The GetOrderByExpression returns Dynamic Linq expression:

public class DataTableRequest
{
    public int PageIndex { get; private set; }
    public int PageSize { get; private set; }
    public string Search { get; private set; }
    private List<SortBy> SortingColumns { get; set; }

    public int SEcho { get; private set; }

    public DataTableRequest(int pageIndex, int pageSize, string search, List<SortBy> sortingColumns, int sEcho)
    {   
        PageIndex = pageIndex;
        PageSize = pageSize;
        Search = search;
        SortingColumns = sortingColumns;
        SEcho = sEcho;
    }

    public string GetOrderByExpression()
    {
        // could be passed to EntityFramework with DynamicLinq like query.OrderBy(dataTableRequest.GetOrderByExpression())
        var columnDirectionPairs = SortingColumns.Select(c => Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(c.Column.Replace("_", ".")) + " " + c.Direction);
        var orderByExpression = string.Join(", ", columnDirectionPairs);
        return orderByExpression;
    }

    public class SortBy
    {
        public SortBy(string column, string direction)
        {
            Guard.ArgumentNotNullOrEmpty(column, "column");
            Guard.ArgumentNotNullOrEmpty(direction, "direction");

            Column = column;
            Direction = direction;
        }

        public string Column { get; set; }
        public string Direction { get; set; }
    }
}

data table converter (used for serialization to json):

public class DataTableConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DataTableRequest);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jArray = JArray.Load(reader);

        var tableValueCollection = jArray.Select(x => new { Name = x["name"].Value<string>(), Value = x["value"].Value<string>() }).ToDictionary(x => x.Name, x => x.Value);

        var numberOfColumns = int.Parse(tableValueCollection["iColumns"], CultureInfo.InvariantCulture);

        var columns = new List<string>();

        for (int i = 0; i < numberOfColumns; i++)
        {
            var queryParamName = string.Format("mDataProp_{0}", i.ToString(CultureInfo.InvariantCulture));
            columns.Add(tableValueCollection[queryParamName]);
        }

        var numberOfSortingColumns = int.Parse(tableValueCollection["iSortingCols"], CultureInfo.InvariantCulture);
        var sortingColumns = new List<DataTableRequest.SortBy>();
        for (int i = 0; i < numberOfSortingColumns; i++)
        {
            var sortColQueryParamName = string.Format("iSortCol_{0}", i.ToString(CultureInfo.InvariantCulture));

            if (tableValueCollection[sortColQueryParamName] != null)
            {
                var sortDirQueryParamName = string.Format("sSortDir_{0}", i.ToString(CultureInfo.InvariantCulture));
                var sortingDirection = tableValueCollection[sortDirQueryParamName];

                var sortingColumnIndex = int.Parse(tableValueCollection[sortColQueryParamName], CultureInfo.InvariantCulture);
                var sortingColumnName = columns[sortingColumnIndex];

                sortingColumns.Add(new DataTableRequest.SortBy(sortingColumnName, sortingDirection));
            }
        }

        var displayStart = int.Parse(tableValueCollection["iDisplayStart"], CultureInfo.InvariantCulture);
        var displayLength = int.Parse(tableValueCollection["iDisplayLength"], CultureInfo.InvariantCulture);
        var pageSize = displayLength;
        var pageIndex = displayStart / displayLength;

        string search = null;

        if (tableValueCollection.ContainsKey("sSearch"))
        {
            search = tableValueCollection["sSearch"];
        }

        var sEcho = int.Parse(tableValueCollection["sEcho"], CultureInfo.InvariantCulture);

        var dataTableRequest = new DataTableRequest(pageIndex, pageSize, search, sortingColumns, sEcho);

        return dataTableRequest;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

DataTableModelBinder used to deserialize DataTableRequest object:

public class DataTableModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        var contentType = request.ContentType;
        if (!contentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return (null);

        request.InputStream.Seek(0, SeekOrigin.Begin);
        var bodyText = new StreamReader(request.InputStream).ReadToEnd();

        if (string.IsNullOrEmpty(bodyText)) return (null);

        var jsonObj = JObject.Parse(bodyText);
        var jArray = (JArray)jsonObj["aoData"];

        var tableValueCollection = jArray.Select(x => new { Name = x["name"].Value<string>(), Value = x["value"].Value<string>() }).ToDictionary(x => x.Name, x => x.Value);

        var numberOfColumns = int.Parse(tableValueCollection["iColumns"], CultureInfo.InvariantCulture);

        var columns = new List<string>();

        for (int i = 0; i < numberOfColumns; i++)
        {
            var queryParamName = string.Format("mDataProp_{0}", i.ToString(CultureInfo.InvariantCulture));
            columns.Add(tableValueCollection[queryParamName]);
        }

        var numberOfSortingColumns = int.Parse(tableValueCollection["iSortingCols"], CultureInfo.InvariantCulture);
        var sortingColumns = new List<DataTableRequest.SortBy>();
        for (int i = 0; i < numberOfSortingColumns; i++)
        {
            var sortColQueryParamName = string.Format("iSortCol_{0}", i.ToString(CultureInfo.InvariantCulture));

            if (tableValueCollection[sortColQueryParamName] != null)
            {
                var sortDirQueryParamName = string.Format("sSortDir_{0}", i.ToString(CultureInfo.InvariantCulture));
                var sortingDirection = tableValueCollection[sortDirQueryParamName];

                var sortingColumnIndex = int.Parse(tableValueCollection[sortColQueryParamName], CultureInfo.InvariantCulture);
                var sortingColumnName = columns[sortingColumnIndex];

                sortingColumns.Add(new DataTableRequest.SortBy(sortingColumnName, sortingDirection));
            }
        }

        var displayStart = int.Parse(tableValueCollection["iDisplayStart"], CultureInfo.InvariantCulture);
        var displayLength = int.Parse(tableValueCollection["iDisplayLength"], CultureInfo.InvariantCulture);
        var pageSize = displayLength;
        var pageIndex = displayStart / displayLength;

        string search = null;

        if (tableValueCollection.ContainsKey("sSearch"))
        {
            search = tableValueCollection["sSearch"];
        }

        var sEcho = int.Parse(tableValueCollection["sEcho"], CultureInfo.InvariantCulture);

        var dataTableRequest = new DataTableRequest(pageIndex, pageSize, search, sortingColumns, sEcho);

        return dataTableRequest;
    }
}

register model binder on Application_Start in Global.asax.cs:

ModelBinders.Binders.Add(typeof (DataTableRequest), new DataTableModelBinder());

I'm using DataTables 1.9.4 and following json model binder:

public class JsonModelBinder : DefaultModelBinder
{
    public static JsonSerializerSettings GlobalSerializerSettings
    {
        get
        {
            return new JsonSerializerSettings()
            {                    
                ContractResolver = new CamelCasePropertyNamesContractResolver(),                    
                Converters = { new IsoDateTimeConverter() }
            };
        }
    }

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (!IsJSONRequest(controllerContext))
        {
            return base.BindModel(controllerContext, bindingContext);
        }
        // Get the JSON data that's been posted
        var request = controllerContext.HttpContext.Request;

        request.InputStream.Seek(0, SeekOrigin.Begin);
        var streamReader = new StreamReader(request.InputStream);
        var jsonStringData = streamReader.ReadToEnd();

        if (string.IsNullOrEmpty(jsonStringData))
            return null;

        return JsonConvert.DeserializeObject(jsonStringData, bindingContext.ModelMetadata.ModelType, GlobalSerializerSettings);
    }

    protected static bool IsJSONRequest(ControllerContext controllerContext)
    {
        var contentType = controllerContext.HttpContext.Request.ContentType;
        return contentType.Contains("application/json");
    }
}

replacing the default model binder:

ModelBinders.Binders.DefaultBinder = new JsonModelBinder();

这篇关于图书馆jQuery的数据表ASP.NET MVC的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆