我在這里遺漏了一些東西。這是我的控制器方法
public void SubmitSweep(int personID, int DD, int MM, int YYYY, int hh, int mm, int dealId)
這是我的按鈕定義
<button id="submit@(person.Id)" class="btn btn-secondary" OnClick="submitSweep(@(person.Id), @(person.sweepDay), @(person.sweepMonth), @(person.sweepYear), @(person.sweepHour), @(person.sweepMinutes), @(person.dealId))">Submit Sweep</button>
這是我的 JS 函式
function submitSweep(thePersonID, sweepDay, sweepMonth, sweepYear, sweepHours, sweepMinutes, theDealId) {
$.ajax({
type: 'POST',
url: '@Url.Action("SubmitSweep", "Home")',
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify({ personID: thePersonID, DD: sweepDay, MM: sweepMonth, YYYY: sweepYear, hh: sweepHours, mm: sweepMinutes, dealId: theDealId }),
success: function (data) {
alert("Success");
},
error: function (ob, errStr) {
alert("An error occured.Please try after sometime." errStr " " ob.responseText);
}
});
}
函式被命中并且引數被填充。我已經破解并確定問題出在 AJAX 資料欄位上。如果我在控制器中沒有引數,我會到達我的斷點,因此確信錯誤在我的資料行中。
如果我編輯我的 JS 函式看起來像這樣
function submitSweep(thePersonID, sweepDay, sweepMonth, sweepYear, sweepHours, sweepMinutes, theDealId) {
var obj = {};
obj.personID = thePersonID;
obj.DD = sweepDay;
obj.MM = sweepMonth;
obj.YYYY = sweepYear;
obj.hh = sweepHours;
obj.mm = sweepMinutes
obj.dealId = theDealId;
$.ajax({
type: 'POST',
url: '@Url.Action("SubmitSweep", "Home")',
contentType: "application/json; charset=utf-8",
dataType: "json",
data: obj,
success: function (data) {
alert("Success");
},
error: function (ob, errStr) {
alert("An error occured.Please try after sometime." errStr " " ob.responseText);
}
});
}
我在標記中回傳一個錯誤,標題標簽顯示無效 JSON 原語:personID。請注意,我在 Data 元素中傳遞了 obj。
如果我將資料線更改為
data: JSON.stringify(obj),
然后我用包含已添加具有相同鍵的專案的標題重新標記。在上述兩種情況下,我的控制器斷點都不會被命中。
我正在運行 VS 2022,我猜大多數是新的庫。
任何幫助或指示將不勝感激。
干杯
?
uj5u.com熱心網友回復:
由于您使用的是 json,因此您必須從正文中讀取資料。動作中的 body 只能獲取一個輸入引數。所以你需要一個視圖模型
public class ViewModel
{
public int personID {get; set;}
public int DD {get; set;}
public int MM {get; set;}
public int YYYY {get; set;}
public int hh {get; set;}
public int mm {get; set;}
public int dealId {get; set;}
}
和行動
public ActionResult SubmitSweep([FromBody] ViewModel model)
{
}
或者,如果您想保持操作原樣,則必須從 ajax 中洗掉 contentType:json 并且不要對物件進行字串化
$.ajax({
type: 'POST',
url: '@Url.Action("SubmitSweep", "Home")',
dataType: "json",
data: obj,
...
uj5u.com熱心網友回復:
解決了它,我想我會分享它,以防萬一其他人有我剛剛浪費了好幾天的腦力衰竭!
問題出在我的控制器方法簽名上。我將它從上面原始問題中的內容更改為
public void SubmitSweep(int personID, int day, int month, int year, int hour, int minute, int dealId)
將我的 JS 函式中的引數名稱更改為像這樣匹配
function submitSweep(thePersonID, sweepDay, sweepMonth, sweepYear, sweepHours, sweepMinutes, theDealId) {
var obj = {};
obj.personID = thePersonID;
obj.day = sweepDay;
obj.month = sweepMonth;
obj.year = sweepYear;
obj.hour = sweepHours;
obj.minute = sweepMinutes;
obj.dealId = theDealId;
$.ajax({
type: 'POST',
url: '@Url.Action("SubmitSweep", "Home")',
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(obj),
success: function (data) {
alert("Success");
},
error: function (ob, errStr) {
alert("An error occured.Please try after sometime." errStr " " ob.responseText);
}
});
}
現在它起作用了。顯然 JS 和 C# 一樣區分大小寫,但發布的 URL“不”。希望這會幫助那些愚蠢地為自己創造同樣問題的人。記住的教訓,總是使用有意義的變數名!
?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456344.html
