代码之家  ›  专栏  ›  技术社区  ›  awrigley

如果jquery隐藏了一个DDL,那么updateModel就不能一直为我工作。

  •  1
  • awrigley  · 技术社区  · 16 年前

    我的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)
    

    并在下面的行中输入正确的值SICK:

    IllnessDetailFormViewModel mfv = new IllnessDetailFormViewModel(ill);
    

    但是,当所有的都说了、做了并返回给客户时,显示的值是:

    sick.IdInfectiousAgent
    

    而不是:

    ill.IdInfectiousAgent
    

    我能想到的唯一原因是jquery隐藏了DDL感染代理。还是我把灯柱弄错了?

    安得烈

    3 回复  |  直到 15 年前
        1
  •  0
  •   griegs    16 年前

    这似乎有点奇怪。我能想到的只有两件事:尝试;

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

    另一件事我会尝试这样宣布你的控制器;

    public ActionResult Edit(IllnessDetail ill, FormCollection formCollection)
    

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

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

    不确定这两者是否有帮助,因为这似乎是一个奇怪的错误正在发生。

    如果这样做不能解决问题,那么您也可以发布HTML。

    希望这有帮助。

        2
  •  0
  •   awrigley    16 年前

    我已经在使用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/编辑 [接受动词(httpverbs.post)] 公共操作结果编辑(illnessDetail Ill

    但是,即使用正确的数据填充了ill对象,稍后对updateModel(sick)的调用也不起作用。

    有人知道这是为什么吗?

    顺便说一下,我上面说我去年病了。不,不是脑炎。我患的是心内膜炎,一种心脏内的感染,通常在心脏瓣膜上。糟糕的工作,但一切都会好起来。即使在心脏手术中结束…

        3
  •  0
  •   awrigley    15 年前

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

    我最后通过在火狐中打开页面并使用Firebug查看是否发生了错误来检测到错误。这对一些人来说似乎很明显,但我对Ajax还是个新手。但后来我下载了Firebug并发现它很好…

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

    有问题的错误是,我在升级到MVC 2的应用程序中使用了httpget,因此被新的 jsonRequestBehavior参数 ,如:

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

    这个参数在MVC 1中不存在,我不知道它是如何分配给MVC 2的。如他们所说的RTFM。

    推荐文章