2

私は元々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()代わりに機能しました。

ありがとう、ジェシー、そしてみんな。

4

1 に答える 1

1

投稿からビューを返しているため、クライアント側のメッセージが機能していません。クライアント側の更新を処理する場合は、おそらく何らかの形式の json 結果を返す必要があります。

return new JsonResult
{
    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
    Data = new { Success = "Some success message here" }
};

編集:あなたのコメントによると、jQuery $.post 関数が正しく設定されているとは思いません。以下を追加してみてください。

dataType: 'json',
contentType: 'application/json; charset=utf-8',
于 2012-05-14T15:57:48.397 に答える