私は元々javascriptシリアライゼーションとjQueryを使用してMVCでフォームを作成し、コントローラーメソッドに $.post() を作成しました。何らかの理由で単一のフィールドがメソッド引数にバインドされていないことを除いて、これは正常に機能していたため、代わりにこの問題を修正した MVC 組み込みモデル バインディングに切り替えました。ただし、この結果、応答メッセージから切り離されてしまいます。検証メッセージは引き続き正常に表示されますが、「alert('saved')」などは機能せず、条件付きでページを更新するなどの他のことを行う方法がわかりません。
どんな助けでも大歓迎です。
ありがとう。
編集:
jQuery コードは次のとおりです。
$.post(
'controllerURL',
{
IRN: irn,
SepId: sepId,
JvsId: jvsId,
From: from,
To: to,
Notes: notes,
CTA: cta
},
function (data) {
if(data.Success == null) {
alert(data.Error);
return;
}
alert(data.Success);
reloadPage();
},
'json'
);
コントローラーメソッドは次のようになります。
[HttpPost]
public ActionResult UpdateJvsEntry(JVSDataEntryModel model) //(string IRN, int SepId, int? JvsId, DateTime From, DateTime? To, string Notes, int CTA)
{
if (model.To.HasValue && model.To.Value < model.From)
{
ModelState.AddModelError("Error", "To can not be prior to From.");
//return Json(new { Error = "To can not be prior to From." });
}
var entry = new EmisJvs();
if (model.JvsEntryId > 0)
{
entry = _jvsDataService.GetWhere(w => w.JvsId == model.JvsEntryId && w.SEPID == model.SepId).Single();
}
else
{
if (DoesJvsHaveOpenEntries(model.SepId))
{
ModelState.AddModelError("Error", "You must close out the current JVS entry before creating a new one.");
//return Json(new { Error = "You must close out the current JVS entry before creating a new one." });
}
entry.SEPID = model.SepId;
}
entry.SchoolIRN = model.SchoolIRN;
entry.From = model.From;
entry.To = model.To;
entry.Notes = model.Notes ?? string.Empty;
entry.Percentage = model.CTA;
entry.ChangedOn = DateTime.Now;
entry.ChangedBy = _userService.CurrentUser().SepId;
if (model.JvsEntryId == 0)
{
_jvsDataService.Insert(entry);
}
if (ModelState.IsValid)
{
_jvsDataService.SaveChanges(entry);
}
return View("JVSDataEntry", model);
}
別の編集:
以前行っていた $.post() ソリューションに戻ることになりました。ネイティブ MVC フォームを介してモデル バインディング ルートに進むことは、私が取り組んでいる現在のプロジェクト アーキテクチャと一致していません。モデル バインディングを調査するきっかけとなった最初の問題は、ページ上または jQuery 自体内の奇妙な点に関係しています。ID「メモ」の要素がページに存在することを確認できますが$('#Notes').val()
、入力ボックスにテキストが実際にあるにもかかわらず、何も返されませんでした。結局、長い形式のカスケード スタイル セレクターを実行する必要があり、$('div[class=\'jvsDataEntryDiv\'] input[id=\'Notes\']').val()
代わりに機能しました。
ありがとう、ジェシー、そしてみんな。