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 的工作原理仍然很模糊。调试似乎表明正确的值被传递给了 action 方法:

public ActionResult Edit(IllnessDetail ill)

并将正确的值放入以下行中的病态:

IllnessDetailFormViewModel mfv = new IllnessDetailFormViewModel(ill);

然而,当一切都说完并返回给客户端时,显示的是以下值:

sick.IdInfectiousAgent

而不是以下值:

ill.IdInfectiousAgent

我能想到的唯一原因是 ddlInfectiousAgent 已被 jQuery 隐藏。还是我叫错了灯柱?

安德鲁

4

3 回答 3

0

这似乎有点奇怪。我能想到的唯一两件事是;

不要隐藏 DDL,看看是否能解决问题。当 DDL 隐藏时,MVC 可能会忽略模型中的值。如果它被隐藏,那么它就是不需要的,这可能是合理的。

我要尝试的另一件事是像这样声明您的控制器;

public ActionResult Edit(IllnessDetail ill, FormCollection formCollection)

然后,您可以从 formCollection 中提取每个值并手动插入到您的模型中。

所以string myVal = formCollection["ddlName"];

不确定其中任何一个是否会有所帮助,因为这似乎是一个奇怪的错误。

如果这不能解决问题,那么也许您也可以发布 html。

希望这可以帮助。

于 2010-02-21T22:26:50.390 回答
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));
        }

具体来说,我已经手动更新了模型数据的属性,这些属性引用了根据第一个用户输入显示或隐藏的级联 ddls:

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

刚刚意识到我没有更新这个。整个问题的原因根本与 jQuery 无关,因为服务器代码中发生了错误,被 AJAX 响应“吞下”。

我终于通过在 FireFox 中打开页面并使用 FireBug 查看是否发生任何错误来检测到错误。这对某些人来说似乎很明显,但我是 AJAX 的新手。但是后来我下载了FireBug,发现它很好......

jQuery 实际上只是(正确地)告诉我调用没有返回任何结果。我没有想到这可能是因为返回了错误。

有问题的错误是我在升级到 MVC 2 的应用程序中使用了 HttpGet,因此被新的JsonRequestBehavior 参数卡住了,如下所示:

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

这个参数在 MVC 1 中不存在,我不知道它对 MVC 2 的添加。正如他们所说的那样,RTFM。

于 2010-09-14T08:15:15.203 回答