2017-03-22 2 views
0
An invalid request URI was provided. The request URI must either be an absolute URI or BaseAddress must be set. 

Hier ist der Api Controller:eine ungültige Anfrage URI bereitgestellt wurde in Datatable WebAPI Aufruf

EmailTemplate.UI\Areas\Ticket\Api\TicketController.cs 

hier ist der Code:

var client = new HttpClient(); 


       string _url = _apiTicket + "Areas/Ticket/Api/TicketController/Get/10?PageIndex=" + pageIndex + "&PageSize=" + pageSize; 
       var response = client.GetAsync(_url).Result; 
       var result1 = response.Content.ReadAsStringAsync().Result; 

hier als Reaktion dieser Fehler kommt.

i von pageindex und Seitengröße in Datatable Server-Seite mvc 4.

Hier Daten filtern wollen, ist das Verfahren in api:

public HttpResponseMessage Get1(int UserId) 
    { 
     string _searchString = GetQueryValueByName.Get(Request.GetQueryNameValuePairs(), "searchstr"); 
     int _start = int.Parse(GetQueryValueByName.Get(Request.GetQueryNameValuePairs(),"start")); 
     int _length =int.Parse(GetQueryValueByName.Get(Request.GetQueryNameValuePairs(),"length")); 
     List<sp_Ticketlist_Result> _dbData; 
     int _dataTotaRowCount; 
     _dbData = _repository.GetTicket(UserId).ToList(); 
     _dataTotaRowCount = _dbData.Count(); 
     if (!string.IsNullOrEmpty(_searchString)) 
     { 
      _dbData = _dbData.Where(m => 
      m.Name.ToUpper().Contains(_searchString.ToUpper())).ToList(); 
      _dataTotaRowCount = _dbData.Count(); 
      _dbData = _dbData.Skip(_start).Take(_length).ToList(); 
     } 
     else 
     { 
      _dbData = _dbData.Skip(_start).Take(_length).ToList(); 
     } 
     return Request.CreateResponse(HttpStatusCode.OK,DataTableObjectConverter.ConvertData(_dbData, _dataTotaRowCount)); 
    } 
    public static class GetQueryValueByName 
    { 
     public static string Get(IEnumerable<KeyValuePair<string, string>> _req, 
           string key) 
     { 
      return _req.FirstOrDefault(ma => string.Compare(ma.Key, key) == 
             0).Value; 
     } 
    } 
    public static class DataTableObjectConverter 
    { 
     public static DataTableObject ConvertData<T>(T source, int count) 
      where T : class, new() 
     { 
      DataTableObject _obj = new DataTableObject(); 
      //_obj.draw = 1; 
      _obj.recordsFiltered = count; 
      _obj.recordsTotal = count; 
      _obj.data = source; 
      return _obj; 
     } 
    } 

Gibt es für jedes Verfahren, mit pageindex und Seitengrße müssen ??

Wie kann ich Daten über pageIndex aufrufen und pagesize definiert in Methode ??

Hier ist meine Methode GetData:

public ActionResult GetData() 
     { 
      // Initialization. 
      JsonResult result = new JsonResult(); 

      try 
      { 
       // Initialization. 
       string search = Request.Form.GetValues("search[value]")[0]; 
       string draw = Request.Form.GetValues("draw")[0]; 
       string order = Request.Form.GetValues("order[0][column]")[0]; 
       string orderDir = Request.Form.GetValues("order[0][dir]")[0]; 
       int startRec = Convert.ToInt32(Request.Form.GetValues("start")[0]); 
       // int pageSize = Convert.ToInt32(Request.Form.GetValues("length")[0]); 


       var start = Request.Form.GetValues("start").FirstOrDefault(); 
       var length = Request.Form.GetValues("length").FirstOrDefault(); 
       int pageSize = length != null ? Convert.ToInt32(length) : 0; 
       int recordStatr = start != null ? Convert.ToInt32(start) : 0; 
       recordStatr = recordStatr == 0 ? 1 : recordStatr; 
       var pageIndex = (recordStatr/pageSize) + 1; 
       int recordsTotal = 0; 
       // Loading. 
       List<AppTicket> data = this.LoadData(); 

       // Total record count. 
       int totalRecords = data.Count; 

       // Verification. 
       //if (!string.IsNullOrEmpty(search) && 
       // !string.IsNullOrWhiteSpace(search)) 
       //{ 
       // // Apply search 
       // data = data.Where(p => p.Title.ToString().ToLower().Contains(search.ToLower()) || 
       //       p.Name.ToLower().Contains(search.ToLower()) || 
       //       p.Email.ToString().ToLower().Contains(search.ToLower())).ToList(); 
       // //p.ProductName.ToLower().Contains(search.ToLower()) || 
       // //p.SpecialOffer.ToLower().Contains(search.ToLower()) || 
       // //p.UnitPrice.ToString().ToLower().Contains(search.ToLower()) || 
       // //p.UnitPriceDiscount.ToString().ToLower().Contains(search.ToLower())).ToList(); 
       //} 

       // Sorting. 
       data = this.SortByColumnWithOrder(order, orderDir, data); 

       // Filter record count. 
       int recFilter = data.Count; 

       // Apply pagination. 
       // data = data.Skip(startRec).Take(pageSize).ToList(); 

       // Loading drop down lists. 
       // result = this.Json(new { draw = Convert.ToInt32(draw), recordsTotal = totalRecords, recordsFiltered = recFilter, data = data }, JsonRequestBehavior.AllowGet); 





       //Find Order Column 
       //var sortColumn = Request.Form.GetValues("columns[" + Request.Form.GetValues("order[0][column]").FirstOrDefault() + "][name]").FirstOrDefault(); 
       //var sortColumnDir = Request.Form.GetValues("order[0][dir]").FirstOrDefault(); 




       var client = new HttpClient(); 


       //client.BaseAddress = new Uri("http://localhost:1849"); 
       //client.DefaultRequestHeaders.Accept.Clear(); 
       // client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
       // string _url = _apiTicket + ".Get?UserId=" + 10 + "&PageIndex=" + pageIndex + "&PageSize=" + pageSize; 
       //var response = client.GetAsync(_url).Result; 
       //var response1 = client.GetAsync("/Areas/Ticket/Api/Get/10,10,10").Result; 
       //if (response1.IsSuccessStatusCode) 
       //{ 
       // string responseString = response.Content.ReadAsStringAsync().Result; 
       //} 
       // string _url = _apiTicket + "Get1/10?searchstr=Monaj&PageIndex=" + pageIndex + "&PageSize=" + pageSize; 
       // string apiUrl = "Api/Ticket/10?searchstr=Monaj&PageIndex=" + pageIndex + "&PageSize=" + pageSize; 
       string apiUrl = "../Areas/api/Ticket/1?searchstr=Monaj&start=0&length=10"; 
       var response = client.GetAsync(apiUrl).Result; 
       var result1 = response.Content.ReadAsStringAsync().Result; 



       // HttpResponseMessage response = await client.GetAsync(_url); 
       // HttpResponseMessage response = client.GetAsync(_url).Result; 
       //var response = client.GetAsync(_url).Result; 
       // var result1 = response.Content.ReadAsStringAsync().Result; 

       JsonResult jsonresult = Json(result1, JsonRequestBehavior.AllowGet); 
       AppTicket _contacts = new AppTicket(); 

       _contacts = JsonConvert.DeserializeObject<AppTicket>(jsonresult.Data.ToString()); 

       //return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = _contacts.listcourses }, JsonRequestBehavior.AllowGet); 
       result = this.Json(new { draw = Convert.ToInt32(draw), recordsFiltered = totalRecords, recordsTotal = recordsTotal, data = data }, JsonRequestBehavior.AllowGet); 




      } 
      catch (Exception ex) 
      { 
       // Info 
       Console.Write(ex); 
      } 

      // Return info. 
      return result; 
     } 

ich die json Ajax hier in custom-datatable.js verwenden. hier ist der Code:

$(document).ready(function() 
{ 
    debugger 
    $('#TableId').DataTable(
    { 
     //"columnDefs": [ 
     // { "width": "5%", "targets": [0] }, 
     // { 
     //  "className": "text-center custom-middle-align", 

     //  "targets": [0, 1, 2, 3, 4, 5, 6] 
     // }, 
     //], 
     'columnDefs': [{ 
      'targets': 0, 
      'searchable': false, 
      'orderable': false, 
      'width': '1%', 
      'className': 'dt-body-center', 


      'render': function (data, type, full, meta) { 
       return '<input type="checkbox">'; 
      } 
     } 
     , 
      { 
       targets: 2, 
       render: function (data, type, row, meta) { 
        if (type === 'display') { 
         data = '<a href="/TicketTemplate/AppDetails/' + row.Id + ' " >' + data + '</a>'; 
        } 

        return data; 
       } 
      }, 

      { 
       targets: 1, 
       render: function (data, type, row, meta) { 
        return moment(data).format('DD/MM/YYYY HH:mm:ss');     
       } 
      } 
     ], 
     "language": 
      { 
       "processing": "<div class='overlay custom-loader-background'><i class='fa fa-cog fa-spin custom-loader-color'></i></div>" 
      }, 
     "processing": true, 
     "serverSide": true, 
     "ajax": 
      { 
       "url": "/TicketTemplate/GetData", 
       "type": "POST", 
       "dataType": "JSON" 
      }, 
     "columns": [ 
        { "data": '' }, 
        { "data": "CreatedDate" }, 
        { "data": "Title" }, 
        //{ 
        // //"data": "title", 
        // "render": function (data, type, row, meta) { 
        //  //return '<a href=\"' + title + '\">' + title + '</a>'; 
        //  return '<a href="' + title + '">' + data + '</a>'; 
        // } 
        //}, 
         //{ 
         //{ 
         // //"data": "title", 
         // "render": function (data, type, row, meta) { 
         //  //return '<a href=\"' + title + '\">' + title + '</a>'; 
         //  return "<a href=" + "/" + "/TicketTemplate/AppDetails/" + row.Id + " id=" + row.Id + ">" + row.Title + " </a>"; 


         // } 
         //}, 

        { "data": "Name" }, 
        { "data": "Email" }, 
        { "data": "AssignTo" }, 
        { "data": "Status" }     
     ] 




    }); 
}); 

Zunächst einmal ist es das MVC-Controller GetData getroffen() und in GetData() rufen die Api-Controller Get(). Paging Sortierung Suche alle sind in der Verwendung von API dynamisch.

+0

Konnte nicht Ihren Code verstehen. Kannst du es bitte richtig machen, welches sind die Api Controller Methoden ?? –

+0

In Ihrer Api-Methode sind kein pageIndex und keine Seitengröße definiert. Es gibt alle Werte von userId in einer Liste zurück. Warum übergeben Sie pageIndex und pagesize? –

+0

im obigen Fall in Get-Controller möchte ich – Manoj

Antwort

0

Wie Sie in Ihrem Kommentar erwähnt, dass „i die Datentabelle Paging Sortierung der Suche durch MVC-Controller und Web-api Controller nennen wollen“, dann würde ich empfehlen, so zu tun, das ist, was ich in getan haben viele Projekte.

//This is my API Get method 
public HttpResponseMessage Get(int id) 
{ 
    string _searchString = 
    GetQueryValueByName.Get(Request.GetQueryNameValuePairs(), "searchstr"); 
    int _start = 
    int.Parse(GetQueryValueByName.Get(Request.GetQueryNameValuePairs(), 
      "start")); 
    int _length = 
    int.Parse(GetQueryValueByName.Get(Request.GetQueryNameValuePairs(), 
      "length")); 
    List<sp_Ticketlist_Result> _dbData; 
    int _dataTotaRowCount; 
    _dbData = _repository.GetTicket(id).ToList(); 
    _dataTotaRowCount = _dbData.Count(); 
    if (!string.IsNullOrEmpty(_searchString)) 
     { 
     _dbData = _dbData.Where(m => 
     m.Name.ToUpper().Contains(_searchString.ToUpper())).ToList(); 
     _dataTotaRowCount = _dbData.Count(); 
     _dbData = _dbData.Skip(_start).Take(_length).ToList(); 
     } 
    else 
     { 
     _dbData = _dbData.Skip(_start).Take(_length).ToList(); 
     } 
    return Request.CreateResponse(HttpStatusCode.OK, 
    DataTableObjectConverter.ConvertData(_dbData, _dataTotaRowCount)); 
    } 

Bellow ist mein GetQueryValueByName und DataTableObjectConverter Klasse, dass ich in einer separaten Klassendatei gehalten und nur auf meine Api-Controller verweisen.

public static class GetQueryValueByName 
{ 
public static string Get(IEnumerable<KeyValuePair<string, string>> _req, 
          string key) 
    { 
    return _req.FirstOrDefault(ma => string.Compare(ma.Key, key) == 
           0).Value; 
    } 
} 

public static class DataTableObjectConverter 
{ 
    public static DataTableObject ConvertData<T>(T source, int count) 
     where T : class, new() 
    { 
     DataTableObject _obj = new DataTableObject(); 
     //_obj.draw = 1; 
     _obj.recordsFiltered = count; 
     _obj.recordsTotal = count; 
     _obj.data = source; 
     return _obj; 
    } 
} 

public class DataTableObject 
{ 
    public int recordsTotal { get; set; } 
    public int recordsFiltered { get; set; } 
    public Object data { get; set; } 
} 

Dann wird meine URL so sein,

string apiUrl = "http://localhost:55442/api/Ticket/1? 
       searchstr=Monaj&start=0&length=10"; 
var client = new HttpClient(); 
var response = client.GetAsync(apiUrl).Result; 
var result1 = response.Content.ReadAsStringAsync().Result; 

Hinweis: See, hier bin ich vorbei Start, Länge, Such-String als Abfrage-String und ich holen sie in meinem API-Get-Methode. Aktualisieren Sie einfach Ihre URL hier und geben Sie keine / in Abfrage-String-Parameter. Sie haben so geschrieben,

" + pageIndex + "/PageSize=" + pageSize; 

Das ist falsch. Überprüfen Sie, wie ich es gemacht habe. Sie müssen trennen durch &

+0

zu rufen GetQueryValueByName was ist das – Manoj

+0

Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackoverflow.com/rooms/138728/discussion-between-basanta-matia-and-manoj). –

Verwandte Themen