ASP.NET MVC 및 JQuery를 가르치는 작은 응용 프로그램을 만들고 있으며 페이지 중 하나는 일부를 선택할 수있는 항목 목록입니다. 그런 다음 버튼을 누르고 JQuery의 Post 기능을 사용하여 선택한 항목의 ID가 포함 된 List (또는 이와 동등한 것)를 컨트롤러에 보냅니다.
선택한 요소의 ID가있는 배열을 얻을 수 있었고 이제 게시하고 싶습니다. 내가 할 수있는 한 가지 방법은 내 페이지에 숨겨진 값으로 더미 양식을 가지고 선택한 항목으로 숨겨진 값을 설정하고 해당 양식을 게시하는 것입니다. 그러나 이것은 무모 해 보입니다.
어레이를 컨트롤러로 직접 보내서 이것을 달성하는 더 깨끗한 방법이 있습니까? 몇 가지 다른 시도를했지만 컨트롤러가 수신하는 데이터를 매핑 할 수없는 것처럼 보입니다. 지금까지 코드는 다음과 같습니다.
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
그리고 내 컨트롤러는 다음과 같습니다
public ActionResult GenerateList(List<string> values)
{
//do something
}
내가 얻는 것은 컨트롤러 매개 변수에서 “널”입니다 …
팁이 있습니까?
답변
내가 한 테스트 앱의 코드를 포함하도록 응답을 수정했습니다.
업데이트 : ‘전통적인’설정을 true로 설정하여 jQuery를 업데이트하여 다시 작동합니다 (@DustinDavis ‘에 따라).
먼저 자바 스크립트 :
function test()
{
var stringArray = new Array();
stringArray[0] = "item1";
stringArray[1] = "item2";
stringArray[2] = "item3";
var postData = { values: stringArray };
$.ajax({
type: "POST",
url: "/Home/SaveList",
data: postData,
success: function(data){
alert(data.Result);
},
dataType: "json",
traditional: true
});
}
그리고 내 컨트롤러 클래스의 코드는 다음과 같습니다.
public JsonResult SaveList(List<String> values)
{
return Json(new { Result = String.Format("Fist item in list: '{0}'", values[0]) });
}
해당 자바 스크립트 함수를 호출하면 “목록의 첫 번째 항목 : ‘item1′”이라는 경고가 표시됩니다. 도움이 되었기를 바랍니다!
답변
참고 : JQuery는 게시물 데이터를 직렬화하는 방식을 변경했습니다.
http://forum.jquery.com/topic/nested-param-serialization
‘전통’설정을 true로 설정해야합니다.
{ Values : ["1", "2", "3"] }
로 나올 것입니다
Values[]=1&Values[]=2&Values[]=3
대신에
Values=1&Values=2&Values=3
답변
답변 주셔서 감사합니다. 또 다른 빠른 해결책은 JSON 객체를 문자열로 변환하기 위해 전통적인 매개 변수가 true 로 설정된 jQuery.param 메소드 를 사용하는 것입니다 .
$.post("/your/url", $.param(yourJsonObject,true));
답변
데이터를 배열로 게시하지 마십시오. 목록에 바인딩하려면 키 / 값 쌍을 각 키에 대해 동일한 값으로 제출해야합니다.
이를 위해 양식이 필요하지 않아야합니다. $ .post 호출에 포함 할 수있는 키 / 값 쌍 목록 만 있으면됩니다.
답변
에서 .NET4.5
,MVC 5
자바 스크립트 :
JS의 객체 :
게시하는 메커니즘.
$('.button-green-large').click(function() {
$.ajax({
url: 'Quote',
type: "POST",
dataType: "json",
data: JSON.stringify(document.selectedProduct),
contentType: 'application/json; charset=utf-8',
});
});
씨#
사물:
public class WillsQuoteViewModel
{
public string Product { get; set; }
public List<ClaimedFee> ClaimedFees { get; set; }
}
public partial class ClaimedFee //Generated by EF6
{
public long Id { get; set; }
public long JourneyId { get; set; }
public string Title { get; set; }
public decimal Net { get; set; }
public decimal Vat { get; set; }
public string Type { get; set; }
public virtual Journey Journey { get; set; }
}
제어 장치:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Quote(WillsQuoteViewModel data)
{
....
}
받은 물건 :
이것이 시간을 절약하기를 바랍니다.
답변
문자열뿐만 아니라 객체 목록과 함께 작동하는 또 다른 구현 :
JS :
var postData = {};
postData[values] = selectedValues ;
$.ajax({
url: "/Home/SaveList",
type: "POST",
data: JSON.stringify(postData),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(data){
alert(data.Result);
}
});
‘selectedValues’가 객체의 배열이라고 가정합니다.
컨트롤러에서 매개 변수는 해당 ViewModel의 목록입니다.
public JsonResult SaveList(List<ViewModel> values)
{
return Json(new {
Result = String.Format("Fist item in list: '{0}'", values[0].Name)
});
}
답변
내가 여기서 논의했듯이 ,
사용자 정의 JSON 객체를 MVC 작업에 전달하려면이 솔루션을 사용할 수 있습니다. 매력처럼 작동합니다.
public string GetData() {
// InputStream contains the JSON object you've sent
String jsonString = new StreamReader(this.Request.InputStream).ReadToEnd();
// Deserialize it to a dictionary
var dic =
Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < String,
dynamic >> (jsonString);
string result = "";
result += dic["firstname"] + dic["lastname"];
// You can even cast your object to their original type because of 'dynamic' keyword
result += ", Age: " + (int) dic["age"];
if ((bool) dic["married"])
result += ", Married";
return result;
}
이 솔루션의 실제 이점은 각 인수 조합에 대해 새 클래스를 정의 할 필요가 없으며 그 외에 객체를 원래 유형으로 쉽게 캐스트 할 수 있다는 것입니다.
다음과 같은 도우미 방법을 사용하여 작업을 용이하게 할 수 있습니다.
public static Dictionary < string, dynamic > GetDic(HttpRequestBase request) {
String jsonString = new StreamReader(request.InputStream).ReadToEnd();
return Newtonsoft.Json.JsonConvert.DeserializeObject < Dictionary < string, dynamic >> (jsonString);
}