当模型无效时,在视图内返回带有错误消息的部分视图。

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"})

Index Page Index page + partial view Partial view returned when model.isvalid != true

1个回答

10

就我所看到的,您正在使用标准的 Html.BeginForm,将表单提交到 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);
}

最后编写handleSuccess JavaScript函数:

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

如果我使用这种方法,validator.unobtrusive.parse() 将从部分视图中删除。它会影响下拉控件的选择。即使我加载了 validator.unobtrusive.parse(),仍然无法解决这个问题。有什么想法吗?$('#someDivThatCOntainsYourForm').html(result);(==> 如果我删除这个,控件就可以正常工作) - vinodh
值得注意的是,如果您的项目中没有安装Microsoft.jQuery.Unobtrusive.Ajax包,这将无法正常工作。一旦安装了该软件包 - 完美! - PTD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接