8

私のasp.net MVC 4プロジェクトでは、ユーザーが「詳細」をクリックしたときの部分的なビューから何かを保護するのが好きです。データを保存しても問題ありません。部分ビューを閉じても問題ありません。部分ビューを開いても問題ありません。モデルが有効でない場合 (ユーザーが何かをマークするのを忘れた場合) です。その結果、部分ビューが返されます。しかし、本来あるべきビュー内ではありません。スタンドアロンのページとして表示されるだけです。

意見:

@model Evaluatietool.ViewModels.EvaluatorWijzigenOPViewModel
<h3>@ViewBag.Message</h3>
@using (Html.BeginForm("ChangeEvaluator", "Ontwikkelplan"))
{
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.oldEvalAccount)
    @Html.HiddenFor(model => model.selectedMedewerkerAccount)
    @Html.HiddenFor(model => model.eval);
    @Html.HiddenFor(model => model.countMedewerkers);
...

...
<div class="Buttons">
    <input type="submit" value="Submit" />
    @Ajax.ActionLink("Sluiten", "Evaluatorenlijst", new AjaxOptions { OnSuccess = "HideResultDiv" })
</div>
}

コントローラ:

[HttpPost]
    public ActionResult ChangeEvaluator(EvaluatorWijzigenOPViewModel ewopvm)
    {
        if (ModelState.IsValid)
        {
            if (ewopvm.selectedObjects != null)
            {
                ewopvm.selectedObjects.Add(ewopvm.selectedMedewerkerAccount);
            }
            else
            {
                ewopvm.selectedObjects = new List<string>();
                ewopvm.selectedObjects.Add(ewopvm.selectedMedewerkerAccount);
            }
            Ontwikkelplannen op = new Ontwikkelplannen();
            Evaluaties e = new Evaluaties();
            foreach (string s in ewopvm.selectedObjects)
            {
                op.ChangeEvaluator(ewopvm.newEvalAccount, ewopvm.oldEvalAccount, s, ewopvm.eval);
            }
            return RedirectToAction("Evaluatorenlijst");
        }
        return PartialView("EvaluatorWijzigenPartial", ewopvm);
    }

部分ビューを呼び出すリンク

 @Ajax.ActionLink(item.Evaluator1.Naam, "EvaluatorWijzigenPartial", new { id = item.ID,     eval = true }, new AjaxOptions { UpdateTargetId = "EvaluatorWijzigen", OnComplete = "ShowResultDiv"})

インデックスページ 目次ページ+部分図 model.isvalid != true の場合に返される部分ビュー

4

1 に答える 1

11

私が見ることができるものから、検証が失敗した場合にリダイレクトを実行するか、部分的なビューを返すコントローラーアクションHtml.BeginFormへの標準の POSTing を使用しています。ChangeEvaluator

したがって、あなたが観察している行動は完全に正常です。それを実現したい場合は、AJAX を使用してこのフォームを送信する必要があります。

@using (Ajax.BeginForm("ChangeEvaluator", "Ontwikkelplan", new AjaxOptions { OnSuccess = "handleSuccess" }))
{
    ...
}

次に、コントローラーのアクションを調整して、成功した場合にリダイレクトしないようにしますが、リダイレクト先の URL を含む Json オブジェクトを返します。

[HttpPost]
public ActionResult ChangeEvaluator(EvaluatorWijzigenOPViewModel ewopvm)
{
    if (ModelState.IsValid)
    {
        ...
        return Json(new { redirectTo = Url.Action("Evaluatorenlijst") });
    }
    return PartialView("EvaluatorWijzigenPartial", ewopvm);
}

最後にhandleSuccessJavaScript 関数を記述します。

function handleSuccess(result) {
    if (result.redirectTo) {
        // The controller action returned a JSON object with the redirectTo property
        // let's redirect to this location:
        window.location.href = result.redirectTo;
    } else {
        // The controller action returned a partial view with the form and the errors
        // So we need to update some containing DIV with it:
        $('#someDivThatCOntainsYourForm').html(result);
    }
}
于 2013-05-16T13:22:08.567 に答える