我正在做一個小測試牀的應用程序,在這個應用程序中給應用程序一個音符名稱,符號和八度音,並且它會發出音符響起的頻率。爲什麼不把這個javascript對象轉換成C#類對象?
我遇到了通過AJAX發送到服務器的JavaScript對象的問題。但是,它根本不會映射到課程上。
發送者的代碼是一段JavaScript代碼:
$someContainer.on('click', '.raise-pitch', function (e) {
e.preventDefault();
var $line = $(this).parents('.item-line'),
// Cache GUI elements for this line. Not pertinent.
var data = {
'model': {
'NoteName': $noteName.val(),
'Sign': $noteSign.val(),
'Octave': $noteOctave.val()
},
'steps': 1
};
var dataString = JSON.stringify(data);
$.ajax({
type: 'POST',
url: '@Url.Action("AlterPitch", "Home")',
data: dataString,
async: true,
dataType: 'json',
success: function (result) {
// Unimportant things.
}
});
});
在data
對象,你可以看到,我有兩兩件事:model
和steps
。這些步驟決定了我們改變音符的距離。我已經驗證了note name
,sign
和octave
的值正在使其成爲數據對象。 steps
是預先確定的。
的data
對象,然而,映射到一個視圖模型在C#的一面,它看起來像這樣:
public class NoteViewModel
{
public enum NoteSign
{
Natural,
Sharp,
Flat
}
public string NoteName { get; set; }
public NoteSign Sign { get; set; }
public int Octave { get; set; }
public float Frequency { get; set; }
private static readonly Dictionary<string, float> FrequencyLookup = new Dictionary<string, float>
{
{"C", 16.35f},
{"C#", 17.32f},
{"D", 18.35f},
{"D#", 19.45f},
{"E", 20.60f},
{"F", 21.83f},
{"F#", 23.12f},
{"G", 24.50f},
{"G#", 25.96f},
{"A", 27.50f},
{"A#", 29.14f},
{"B", 30.87f}
};
// Methods...not important for reasons below.
}
...本身被封裝在一個獨特的視角模式:
public class AlterPitchViewModel
{
public NoteViewModel model;
public int steps;
public NoteViewModel AlterPitch()
{
model.ChangeStep(steps);
return model;
}
}
...或者至少它應該。我把我的控制器方法斷點:
[HttpPost]
public ActionResult AlterPitch(AlterPitchViewModel model)
{
return Json(model.AlterPitch(), JsonRequestBehavior.AllowGet);
}
...但是,該模型爲空,這導致了NullReference
例外。
該模型不會序列化爲在此上下文中發送的對象。很明顯,我仍然在做錯事。 問題是...什麼?
缺少方法頂部的[HttpPost]屬性? – Askolein
@Askolein - 幫助。儘管如此,請求的「模型」部分出現了奇怪的結果,導致404錯誤。 –
您是否試圖將對象串聯化並將請求內容類型設置爲json? – Andrei