문자열 배열을 ASP에 게시하려면 어떻게 해야 합니까?폼이 없는 NET MVC 컨트롤러
저는 ASP를 독학하기 위해 작은 앱을 만들고 있습니다.NET MVC 및 JQuery 페이지 중 하나는 선택 가능한 항목 목록입니다.그런 다음 JQuery의 Post 기능을 사용하여 선택한 항목의 ID를 포함한 목록(또는 동등한 것)을 컨트롤러로 보내고 싶습니다.
선택한 요소의 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
}
제가 알아낸 건 컨트롤러 파라미터에 "null"이 있다는 것뿐이에요
팁이 있나요?
테스트 앱 코드를 포함하도록 답변을 수정했습니다.
업데이트: 다시 작동하도록 jQuery를 업데이트하여 '기존' 설정을 true로 설정했습니다(@DustinDavis의 답변).
먼저 javascript:
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]) });
}
javascript 함수를 호출하면 "목록의 첫 번째 항목: item1"이라는 알림이 나타납니다.
참고로 JQuery는 포스트 데이터를 시리얼화하는 방법을 변경했습니다.
http://forum.jquery.com/topic/nested-param-serialization
'전통' 설정을 true 또는 wise로 설정해야 합니다.
{ Values : ["1", "2", "3"] }
로서 나올 것이다.
Values[]=1&Values[]=2&Values[]=3
대신
Values=1&Values=2&Values=3
답변해 주셔서 감사합니다.다른 빠른 해결책은 jQuery.param 메서드를 true로 설정한 기존 파라미터를 사용하여 JSON 객체를 문자열로 변환하는 것입니다.
$.post("/your/url", $.param(yourJsonObject,true));
데이터를 배열로 게시하지 마십시오.목록에 바인드하려면 키/값 쌍을 각 키에 대해 동일한 값으로 전송해야 합니다.
이 작업을 수행하기 위해 양식이 필요하지 않습니다.$.post 콜에 포함할 수 있는 키/값 쌍 리스트만 있으면 됩니다.
인.NET4.5
,MVC 5
Javascript:
JS의 객체:
포스트하는 메커니즘입니다.
$('.button-green-large').click(function() {
$.ajax({
url: 'Quote',
type: "POST",
dataType: "json",
data: JSON.stringify(document.selectedProduct),
contentType: 'application/json; charset=utf-8',
});
});
C#
오브젝트:
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);
}
글로벌 파라미터를 설정할 수 있습니다.
jQuery.ajaxSettings.traditional = true;
그 답변이 제 상황에 많은 도움이 되었기 때문에 감사합니다.단, 향후 참조를 위해 모델에 바인드한 후 검증해야 합니다.이 글은 MVC 2에 대한 Phil Hack의 글입니다.http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx
이게 도움이 됐으면 좋겠네요.
언급URL : https://stackoverflow.com/questions/309115/how-can-i-post-an-array-of-string-to-asp-net-mvc-controller-without-a-form
'programing' 카테고리의 다른 글
TypeError: 정의되지 않은 속성을 읽을 수 없습니다('id' 읽기). (0) | 2023.02.25 |
---|---|
Redx에서 상태를 업데이트한 후 콜백을 트리거하려면 어떻게 해야 합니까? (0) | 2023.02.25 |
TypeScript 2.x, @types 및 시스템에서의 Angular 1.xJS - 글로벌 타이핑 사용 (0) | 2023.02.25 |
블로그 투고용 퍼머링크 구조가 Wordpress 페이지와 다른가요? (0) | 2023.02.25 |
ajax 호출에 대해 별도의 php 파일에서 wp_query를 실행하고 싶다. (0) | 2023.02.25 |