我正在做一个小测试床的应用程序,在这个应用程序中给应用程序一个音符名称,符号和八度音,并且它会发出音符响起的频率。为什么不把这个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