.net MVC и редактирование данных с помощью форм - PullRequest
1 голос
/ 03 января 2009

У меня есть форма для редактирования концертов.

Начальное действие контроллера называется «Редактировать».

Форма отправляет сообщение на второе действие контроллера, называемое «Обновление»

Итак, после публикации формы я использую сделанный на заказ ModelBinder, который использует bindingContext.ModelState.AddModelError, чтобы добавить сообщения проверки в состояние модели

Действие Обновить copntroller выглядит так:

[AcceptVerbs("POST")]
    public ActionResult Update(Guid id, FormCollection formCollection)
    {
        Gig gig = GigManager.GetByID(id);
        try
        {
            UpdateModel<Gig>(gig);
            GigManager.Save(gig);
            return RedirectToAction("List");

        }
        catch (Exception e)
        {
           return View(gig);    
        }

    }

Если в связывателе модели возникнут ошибки, при обновлении модели будет выдано исключение.

Это означает, что RedirectToAction («Edit») вызывается, так что вызывается оригинальное действие «Edit» контроллера.

Это означает, что я не вижу своих сообщений проверки, и любые данные, добавленные пользователем в форму, будут сброшены до исходных значений!

Как мне приблизиться к этому?

Я включил действие «редактировать» ниже:

[AcceptVerbs("GET")]
    public ActionResult Edit(Guid id)
    {
        Gig gig = GigManager.GetByID(id);

        SelectList days = CreateDays(1, 31, 1,  gig.StartDate.Day);
        ViewData["day"] = days;

        SelectList months = CreateMonths(1, 12, 1, gig.StartDate.Month);
        ViewData["month"] = months;

        SelectList years = CreateYears(DateTime.Now.Year, DateTime.Now.Year + 10, 1, gig.StartDate.Year);
        ViewData["year"] = years;

        string bandNames ="";
        string bandIds = "";
        foreach(Act act in  gig.Acts)
        {
            bandNames += act.Name.Trim() + ", ";
            if (act.Artist != null)
            {
                bandIds += act.Artist.ID + ";";
            }
        }

        ViewData["Bands"] = bandNames;
        ViewData["BandIds"] = bandIds;

        return View(gig);

    }

Однако я не получаю сообщения проверки

1 Ответ

1 голос
/ 04 января 2009

Может быть, это поможет. Я только что зафиксировал контроллер, который делает листинг / редактирование админа. Он использует привязку к классу, что может быть удобно. Проверьте в самом конце файла, чтобы увидеть возможные способы обработки глаголов Get и Post. Обратите внимание, что UpdateModelStateWithViolations является просто помощником для добавления ошибок в ModelState.

        Controller.ModelState.AddModelError(violation.PropertyName,
            violation.ErrorMessage);

, который отображается с

<%= Html.ValidationSummary() %>

http://www.codeplex.com/unifico/SourceControl/changeset/view/1629#44699

и просмотр: http://www.codeplex.com/unifico/SourceControl/changeset/view/1629#54418

    [AcceptVerbs("GET")]
    [Authorize(Roles = "Admin")]
    public ActionResult EditRole(Guid? RoleID)
    {
        Role role = null;
        RoleForm form = new RoleForm { };
        if (RoleID.HasValue)
        {
            role = accountService.GetRole(RoleID.Value);
            if (role == null)
                return RedirectToAction("Roles");

            form = new RoleForm
            {
                RoleID = role.ID,
                RoleName = role.Name,
                Level = role.Level
            };
        }
        else
        {
            form = new RoleForm();
        }

        ViewData.Model = form;

        return this.PluginView();
    }


    [AcceptVerbs("POST")]
    [Authorize(Roles = "Admin")]
    public ActionResult EditRole(Guid? RoleID, [Bind(Include = "RoleID,RoleName,Level", Prefix = "")] RoleForm form)
    {
        Role role = null;
        if (RoleID.HasValue)
        {
            role = accountService.GetRole(RoleID.Value);
            if (role == null)
                return RedirectToAction("Roles");
        }

        ServiceResponse<Role> response = accountService.AttemptEdit(form);

        if (response.Successful)
        {
            TempData["Message"] = "Update Successfull";
        }
        else
        {
            this.UpdateModelStateWithViolations(response.RuleViolations);
        }

        //ViewData["AllRoles"] = accountService.GetRolePage(new PageRequest(0, 50, "Name", typeof(string), true)).Page.ToArray();


        ViewData.Model = form;

        return this.PluginView();
    }
...