1

ギグを編集するためのフォームがあります。

最初のコントローラ アクションは「編集」と呼ばれます。

フォームは、「更新」と呼ばれる 2 番目のコントローラー アクションに投稿します。

したがって、フォームが投稿されたら、bindingContext.ModelState.AddModelError を使用してモデル状態に検証メッセージを追加する特注の ModelBinder を使用します。

コプトローラーの更新アクションは次のようになります。

[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);

    }

ただし、検証メッセージが表示されません

4

1 に答える 1

1

多分これは役立つでしょう。リスト/編集管理を行うコントローラーをコミットしました。便利かもしれないクラスのバインディングを使用します。ファイルの最後をチェックして、動詞の取得と投稿を処理するための可能な方法を確認してください。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();
    }
于 2009-01-04T03:04:19.057 に答える