1

私の jQuery コードは、特定の状況下で ddl を非表示にします。この場合、フォームを送信した後、UpdateModel を使用しても一貫して機能しないようです。コントローラー内の私のコード:

// POST: /IllnessDetail/Edit
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(IllnessDetail ill)
        {
            IllnessDetailFormViewModel mfv = new IllnessDetailFormViewModel(ill);
            if (ModelState.IsValid)
            {
                try
                {
                    IllnessDetail sick = idr.GetLatestIllnessDetailByUsername(User.Identity.Name);
                    UpdateModel(sick);
                    idr.Save();
                    return RedirectToAction("Current", "IllnessDetail");
                }
                catch
                {
                    ModelState.AddRuleViolations(mfv.IllnessDetail.GetRuleViolations());
                }
            }
            return View(new IllnessDetailFormViewModel(ill));
        }

私はMVCを始めたばかりで、締め切りに間に合っているので、UpdateModelがどのように機能するかについてはまだ漠然としています。デバッグにより、正しい値がアクション メソッドに渡されていることが明らかになったようです。

public ActionResult Edit(IllnessDetail ill)

そして、正しい値は次の行で sick に入れられます:

IllnessDetailFormViewModel mfv = new IllnessDetailFormViewModel(ill);

ただし、すべてが完了し、クライアントに返されると、次の値が表示されます。

sick.IdInfectiousAgent

次の値の代わりに:

ill.IdInfectiousAgent

考えられる唯一の理由は、ddlInfectiousAgent が jQuery によって隠されていることです。それとも、間違った街灯柱に吠えていますか?

アンドリュー

4

3 に答える 3

0

私はこれを更新していなかったことに気づきました。AJAX応答によって「飲み込まれた」サーバーコードでエラーが発生していたため、問題全体の原因はjQueryとはまったく関係ありませんでした。

FireFoxでページを開き、FireBugを使用してエラーが発生したかどうかを確認することで、最終的にエラーを検出しました。これは一部の人には明白に思えるかもしれませんが、私はAJAXを初めて使用しました。しかし、FireBugをダウンロードして、それが良かったことを確認しました...

jQueryは、実際には(正しく)呼び出しによって結果が返されないことを通知していました。代わりにエラーが返されたことが原因である可能性があることは、私の頭に浮かびませんでした。

問題のエラーは、MVC 2にアップグレードされたアプリでHttpGetを使用していたため、次のように新しいJsonRequestBehaviorパラメーターに引っかかったというものでした。

return Json(IllnessDetailRepository.CascadedInfectiousAgent(Id), 
            JsonRequestBehavior.AllowGet);

このパラメータはMVC1には存在せず、MVC2への追加に気づいていませんでした。RTFMと言われています。

于 2010-09-14T08:15:15.203 に答える
0

次のように、UpdateModel の使用と FormCollection の使用の中間に達しました。

// POST: /IllnessDetail/Edit
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(IllnessDetail ill)
        {
            IllnessDetailFormViewModel mfv = new IllnessDetailFormViewModel(ill);
            try
            {
                ill.username = User.Identity.Name;
                IllnessDetail sick = idr.GetLatestIllnessDetailByUsername(User.Identity.Name);
                sick.IdInfectiousAgent = ill.IdInfectiousAgent;
                sick.IdEncephalitisSubType = ill.IdEncephalitisSubType;
                sick.IdEncephalitisType = ill.IdEncephalitisType;
                UpdateModel(sick);
                idr.Save();
                return RedirectToAction("Current", "IllnessDetail");
            }
            catch
            {
                ModelState.AddRuleViolations(mfv.IllnessDetail.GetRuleViolations());
            }
            return View(new IllnessDetailFormViewModel(ill));
        }

具体的には、最初のユーザー入力に従って表示または非表示になるカスケード ddl を参照するモデル データのプロパティを手動で更新しました。

sick.IdInfectiousAgent = ill.IdInfectiousAgent;
sick.IdEncephalitisSubType = ill.IdEncephalitisSubType;
sick.IdEncephalitisType = ill.IdEncephalitisType;

これが完全なごまかしであることは承知していますが、なぜそれが必要なのかわかりません。ご覧のとおり、メソッド呼び出しでモデル バインダーを使用しています。

// POST: /IllnessDetail/Edit [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(IllnessDetail ill

しかし、問題のあるオブジェクトに正しいデータが取り込まれたとしても、その後の UpdateModel(sick) の呼び出しは機能しません。

なぜこれが起こっているのか、誰にも手がかりがありますか?

ところで、私は昨年病気だったと上で述べました。いいえ、脳炎ではありません。私が患っていたのは心内膜炎でした。これは心臓内の感染症で、通常は心臓弁に発生します。厄介な仕事ですが、終わりよければすべてよしです。心臓手術で終わっても…

于 2010-02-22T14:03:04.457 に答える
0

これは少し奇妙に思えます。私が試してみることができる唯一の2つのことは次のとおりです。

DDL を非表示にしないで、問題が解決するかどうかを確認してください。おそらく、DDL が隠されている場合、MVC はモデル内の値を省略しています。それが隠されている場合、それは望ましくないという合理化かもしれません。

私が試みるもう1つのことは、コントローラーを次のように宣言することです。

public ActionResult Edit(IllnessDetail ill, FormCollection formCollection)

次に、formCollection から各値を抽出し、モデルに手動で挿入できます。

そうstring myVal = formCollection["ddlName"];

奇妙なエラーが発生しているように見えるため、これらのいずれかが役立つかどうかはわかりません.

これで問題が解決しない場合は、html を投稿することもできます。

お役に立てれば。

于 2010-02-21T22:26:50.390 に答える