3

这个问题已经被问过很多次了,但我不认为我需要它。

我正在尝试在主页上实现登录表单,但此表单位于弹出的部分中,就像您在此站点上一样:http: //myanimelist.net

我为我的登录表单创建了一个局部视图:

@model ArtWebShop.Models.customers

@section Validation {
    @Scripts.Render("~/bundles/jqueryval")
}

<section id="login">

    @using (Html.BeginForm("LoginValidate", "Login", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.ValidationSummary(true)
        @Html.ValidationSummary()
        <fieldset>
            <legend>Login</legend>

            @Html.LabelFor(model => model.email)
            @Html.TextBoxFor(m => m.email) 

            @Html.LabelFor(m => m.password)
            @Html.PasswordFor(m => m.password)

            <input type="submit" value="Login" class="button" />
        </fieldset>
    }

</section>

这显示在主页 (index.cshtml)上:

<section class="shown">
    @Html.Partial("_LoginPartial")
    @Html.ValidationSummary(true)
    @Html.ValidationSummary()
</section>

局部视图正确显示。但现在出现了不起作用的部分。

如果您没有填写这些字段,则当您按下登录时,验证会在我的 LoginController 中完成,但是当我重定向时,我似乎无法将错误发送到我的主页视图。

    [HttpPost]
    public ActionResult LoginValidate(string redirect)
    {
        if (_unitOfWork.CustomersRepository.CostumerIsValid(Request.Form["email"], Request.Form["password"]))
        {
            if (!String.IsNullOrEmpty(redirect) || String.Compare(redirect, "none", StringComparison.OrdinalIgnoreCase) == 0)
            {
                if (redirect != null) Response.Redirect(redirect, true);
            }
            else
            {
                return RedirectToAction("index", "Home");
            }
        }
        ModelState.AddModelError("email", "You entered an incorrect email address");
        ModelState.AddModelError("password", "You entered an invalid password");

        return RedirectToAction("index", "Home");
    }

那是我的登录验证。由于没有填写任何错误,因此会将错误添加到 ModelState 中,然后重定向到主页。然而,这并没有向我显示错误。我猜这正是因为我重定向但我该如何解决这个问题?

4

2 回答 2

1

您可以使用TempDataDictionary在重定向之间存储ModelStateDictionary 。

TempDataDictionary 类
表示仅从一个请求持续到下一个请求的一组数据。

在您的LoginValidate操作中,您将像这样存储ModelState

public ActionResult LoginValidate(string redirect)
{
    /* Your other code here (omitted for better readability) */

    ModelState.AddModelError("email", "You entered an incorrect email address");
    ModelState.AddModelError("password", "You entered an invalid password");

    // Add the ModelState dictionary to TempData here.
    TempData["ModelState"] = ModelState;

    return RedirectToAction("index", "Home");
}

在您的HomeControllerIndex操作中,您将检查TempData是否有ModelState

public ActionResult Index()
{
    var modelState = TempData["ModelState"] as ModelStateDictionary;
    if (modelState != null)
    {
        ModelState.Merge(modelState);
    }

    return View();
}

您可以通过使用自定义操作过滤器使其更清晰;请参阅此博客,第 13 号。

于 2012-12-09T11:57:17.587 回答
1

您可以通过使用 jQueryUI Dialogs 和 AjaxForms 来实现这一点。请查看此演示:http ://demo.ricardocovo.com/EditDialogsAndFormRazor/Cars 。您可以为您的登录表单实现与提供的链接中的编辑功能类似的行为。你会发现这里解释的想法:http ://ricardocovo.com/2012/04/06/asp-mvc3-editing-records-with-jqueryui-dialogs-and-ajaxforms-razor-version/

于 2012-12-09T12:58:36.537 回答