MVC

2015-03-04 31 views
5

'daki Sunucuya bir AJAX isteğindeki kimliklerin listesi nasıl geçilir MVC'deki sunucuya AJAX isteğinde, denetleyicinin işlem işlevine bir kimlik listesi listesini nasıl aktarabilirim?MVC

Html yardımcılarıyla birlikte ya da kullanmadan kabul ediyorum.

MVC'nin model bağlayıcılarının, int, string ve bool gibi basit türlere geldiğinde sorun olmadığını biliyorum.

Eylemde kullanmak ve dizmek zorunda olduğum bir şey mi?

ı kullanmak zorunda umurumda değil bir array veya List ve hatta dizeleri eğer int veya strings Hep çevirebiliriz. Onlara sadece sunucuda ihtiyacım var. Listem ids, şu anda boş verir.

JavaScript:

var ids= [1,4,5]; 
// ajax request with ids.. 

MVC Eylem:

public ActionResult ShowComputerPackageBuffer(List<int> ids) // ids are null 
{ 
    // build model ect.. 
    return PartialView(model); 
} 

DÜZENLEME: Eklenen benim AJAX isteği

$(document).ready(function() { 
    $('#spanComputerPackagesBuffer').on('click', function() { 
     var ids = $('#divComputerPackagesBuffer').data('buffer'); 
     console.log('bufferIds: ' + bufferIds); 
     var data = { 
      ids: ids 
     }; 

     var url = getUrlShowComputerPackageBuffer(); 
     loadTable(url, "result", data); 
    }); 
}); 

// AJAX's 
function loadTable(url, updateTargetId, data) { 
    var promise = $.ajax({ 
     url: url, 
     dataType: "html", 
     data: data 
    }) 
    .done(function (result) { 
     $('#' + updateTargetId).html(result); 
    }) 
    .fail(function (jqXhr, textStatus, errorThrown) { 
     var errMsg = textStatus.toUpperCase() + ": " + errorThrown + '. Could not load HTML.'; 
     alert(errMsg); 
    }); 
}; 

// URL's 
function getUrlShowComputerPackageBuffer() { 
    return '@Url.Action("ShowComputerPackageBuffer", "Buffer")'; 
}; 

ÇÖZÜMLER: // Teşekkürler yorumunu @aherrick için. Eğer contentTypeapplication/json ve verileriniz dizgelenmiş emin olmak zorunda

$(function() { 
     var ids = [1, 4, 5]; 
     $.ajax({ 
      type: 'POST', 
      contentType: 'application/json; charset=utf-8', 
      url: '@Url.Action("YourAction", "YourController")', 
      data: JSON.stringify({ ids: ids }) 
     }).done(function() { 

     }); 
    }); 

: Ben

$.ajax({ 
    type: "POST", 
    url: '@Url.Action("ShowComputerPackageBuffer", "Buffer")', 
    dataType: "json", 
    traditional: true, 
    data: { 
     bufferIds: bufferIds 
    } 
}); 
+0

AJAX isteğinizi nasıl hazırladığınızı gösterir misiniz? –

+0

@OmriAharon bir an – radbyx

+1

'' geleneksel' parametresini kullanın. http://stackoverflow.com/questions/4402036/jquery-ajax-posting-array-to-asp-net-mvc-controller – aherrick

cevap

10

traditional parametresini kullanın ve true olarak ayarlayın.

$.ajax({ 
    type: "POST", 
    url: "/URL", 
    dataType: "json", 
    traditional: true, 
    data: {} 
}); 
2

iyi eski "geleneksel" bu bir (Ben kontrol ettim) deneyin kaçırdı. Kontrolcü kullanma

: Aksiyon kullanma

+0

Denedim ve bufferIds (veya ids) hala sunucuda boş. Eylem imzacınız nasıl görünür? – radbyx

0
public ActionResult SaveSomething(int[] requestData) 
//or 
public ActionResult SaveSomething(IEnumerable<int> requestData) 

JSON nesnesi alamaz Sonuç

[HttpPost] 
    [Route("api/Controller/SaveSomething")] 
    public object SaveTimeSheet(int[] requestData) 
    { 
     try 
     { 
      doSomethingWith(requestData); 

      return new 
      { 
       status = "Ok", 
       message = "Updated!" 
      }; 
     } 
     catch(Exception ex) 
     { 
      return new 
      { 
       status = "Error", 
       message = ex.Message 
      }; 
     } 


} 

java script:

var ids = [1,4,5]; 
var baseUrl: 'localhost/yourwebsite' 
$.ajax({ 
        url: baseUrl + '/api/Controller/SaveSomething', 
        type: 'POST', 
        data: JSON.stringify(ids), 
        dataType: 'json', 
        contentType: 'application/json', 
        error: function (xhr) { 
         alert('Error: ' + xhr.statusText); 
        }, 
        success: function (result) { 
         if (result != undefined) { 
          window.location.href = window.location.href; 
         } 
        }, 
        async: false, 
       }); 
+0

Neden bu durumda async: false kullandınız? – MDDDC

+0

Yanıt alınana kadar sayfanın kilidini açmak için bir sebep yok, senkronize istekler tarayıcıyı geçici olarak kilitleyebilir. – SilentTremor