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

それが私のloginValidationです。何も入力されていないため、エラーはModelStateに追加され、ホームページにリダイレクトされます。ただし、これではエラーは表示されません。リダイレクトしたからだと思いますが、どうすれば解決できますか?

4

2 に答える 2

1

これは、jQueryUIダイアログと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 に答える
1

TempDataDictionaryを使用して、リダイレクト間でModelStateDictionaryを格納できます。

TempDataDictionary クラス
1 つの要求から次の要求までのみ保持される一連のデータを表します。

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アクションで、TempDataModelStateがあるかどうかを確認します。

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

    return View();
}

カスタム アクション フィルターを使用すると、これを少しきれいにすることができます。このブログ、番号 13を参照してください。

于 2012-12-09T11:57:17.587 に答える