UpdateModel не работает последовательно для меня, если ddl скрыт jQuery - PullRequest
1 голос
/ 21 февраля 2010

Мой код 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)

И правильное значение ставится больному в следующей строке:

IllnessDetailFormViewModel mfv = new IllnessDetailFormViewModel(ill);

Однако, когда все сказано, сделано и возвращено клиенту, отображается значение:

sick.IdInfectiousAgent

вместо значения:

ill.IdInfectiousAgent

Единственная причина, по которой я могу думать, это то, что ddlInfectiousAgent был скрыт jQuery. Или я лаю не на тот светильник?

Andrew

Ответы [ 3 ]

0 голосов
/ 22 февраля 2010

Я прошел половину пути между использованием 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) не работает.

Кто-нибудь знает, почему это происходит?

Кстати, я уже говорил выше, что болел в прошлом году. Нет, не энцефалит. У меня был эндокардит, инфекция внутри сердца, обычно на сердечных клапанах. Гадкая работа, но все хорошо, что хорошо кончается. Даже если это закончится кардиохирургией ...

0 голосов
/ 14 сентября 2010

Просто понял, что я не обновил это. Причина всей проблемы вообще не была связана с jQuery, поскольку в коде сервера, который был «проглочен» ответом AJAX, произошла ошибка.

Я наконец обнаружил ошибку, открыв страницу в FireFox и используя FireBug, чтобы увидеть, не возникло ли ошибок. Некоторым это может показаться очевидным, но я был новичком в AJAX. Но потом я скачал FireBug и увидел, что это хорошо ...

JQuery на самом деле просто (правильно) говорил мне, что вызов не дал никаких результатов. Мне не пришло в голову, что это может быть потому, что вместо этого была возвращена ошибка.

Ошибка, о которой идет речь, заключалась в том, что я использовал HttpGet в приложении, обновленном до MVC 2, поэтому меня зацепил новый параметр JsonRequestBehavior , например:

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

Этот параметр не существовал в MVC 1, и я не знал о его добавлении в MVC 2. RTFM, как говорится.

0 голосов
/ 22 февраля 2010

Это кажется немного странным. Я могу подумать только о двух вещах:

Не скрывайте DDL и посмотрите, решит ли это проблему. Возможно, MVC опускает значения в модели, когда DDL скрыт. Возможно, логично предположить, что если он скрыт, то он нежелателен.

Другая вещь, которую я бы попробовал, это объявить ваш контроллер следующим образом:

public ActionResult Edit(IllnessDetail ill, FormCollection formCollection)

Затем вы можете извлечь каждое значение из formCollection и вставить в модель вручную.

Итак string myVal = formCollection["ddlName"];

Не уверен, поможет ли что-либо из этого, поскольку кажется, что происходит странная ошибка.

Если это не решит проблему, возможно, вы также можете опубликовать html.

Надеюсь, это поможет.

...