3

ここに画像の説明を入力デフォルトのログイン機能を備えたMVCアプリがあり、チェックボックスモデルの状態をチェックせずにログインすると、 「キーを使用すると、モデルクラスで必須とマークされていませんRemember me」というエラーが追加されます 。私にとっては、私を忘れないでください。"The Remember me? field is required."RememberMe

したがってif(ModelState.IsValid)、ユーザーを検証する前に確認すると、IsValid プロパティは、RememberMe エラーのために false です。

したがって、現在 ModelState["RememberMe"].Errors.Clear();、ログインアクションメソッドとチェックでこのエラーを削除していますModelState.IsValid

このエラーが に追加されないようにするより良い方法はありModelStateますか?

私はVS 2012 RCを使用しています

コントローラ

[HttpPost]    
public ActionResult Login(LoginModel model, string returnUrl) {
    ModelState["RememberMe"].Errors.Clear();
    if(ModelState.IsValid) {
        if(Membership.ValidateUser(model.UserName, model.Password)) {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            if(Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) {
                    return Redirect(returnUrl);
            }                    
            else {
                    return RedirectToAction("Index", "Home");
            }
        }
        else {
           ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

モデル

public class LoginModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

意見

@{ Layout = "~/Views/Shared/_lightLayout.cshtml"; }
@model MvcFoodService.Models.LoginModel
<div class="accountHeader">
    <h2>
        Log In</h2>
    <p>
        Please enter your username and password. @Html.ActionLink("Register", "Register")
        if you don't have an account.</p>
</div>
@using(Html.BeginForm()) {
    @Html.DevExpress().Label(settings => {
        settings.Name = "UserNameLabel";
        settings.Text = "User Name";
        settings.AssociatedControlName = "UserName";
    }).GetHtml()

    <div class="form-field">
        @Html.EditorFor(m => m.UserName)
        @Html.ValidationMessageFor(m => m.UserName)
    </div>

    @Html.DevExpress().Label(settings => {
        settings.Name = "PasswordLabel";
        settings.Text = "Password";
        settings.AssociatedControlName = "Password";
    }).GetHtml()
    <div class="form-field">
        @Html.EditorFor(m => m.Password)
        @Html.ValidationMessageFor(m => m.Password)
    </div>

    <div class="form-field">
        @Html.DevExpress().CheckBox(settings => {
            settings.Name = "RememberMe";
            settings.Text = "Remember me?";            
        }).GetHtml()
    </div>

    @Html.DevExpress().Button(settings => {
        settings.Name = "Button";
        settings.Text = "Log On";
        settings.UseSubmitBehavior = true;
    }).GetHtml()
}
4

3 に答える 3

1

RememberMeフィールドは、devexpressのnull許容チェックボックスです。デフォルト値を設定する必要があります

@Html.DevExpress().CheckBox(settings => {
        settings.Name = "RememberMe";
        settings.Text = "Remember me?";
        settings.Checked = false;
    }).GetHtml()
于 2013-01-23T10:31:18.157 に答える
1

RememberMeフィールドはチェックボックスです。これは、チェックを外した場合、投稿で提供されないことを意味します。

したがって、アクションに次のようなものがある場合:

[HttpPost]
public ActionResult Login(string userName, string password, bool rememberMe)
{
}

値が指定されていないため、失敗します。

アクションを変更することで解決できます。

[HttpPost]
public ActionResult Login(string userName, string password, bool rememberMe = false)
{
}

これは、オプションであることを MVC に伝えます。

次のフォームに非表示の入力を含めることで解決することもできます。

<input type="hidden" name="rememberme" value="false" />
<input type="checkbox" name="rememberme" value="true" />

これは、チェックされている場合は rememberme に 2 つの値を送信し (最後の値が使用されます)、チェックされていない場合は非表示の値 (false) のみを送信します。

アップデート

ビューモデルを使用しているため、チェックボックス入力の上に非表示の入力があるように、RememberMeフィールドを作成または変更する必要があります。bool?

アップデート2:

ビューでこれに変更するだけです:

<div class="form-field">
    @Html.DevExpress().CheckBox(settings => {
        settings.Name = "RememberMe";
        settings.Text = "Remember me?";            
    }).GetHtml()
    <input type="hidden" name="RemberMe" value="false" />
</div>

これで準備完了です。

サイドノート

ASP.NET MVC3:s アクション ヘルパーが生成するコードは、次のようになります。

<input data-val="true" data-val-required="The Remember me? field is required." id="RememberMe" name="RememberMe" type="checkbox" value="true" />
<input name="RememberMe" type="hidden" value="false" />

そのため、DevExpress は MVC3 の動作には従いません (ASP.NET MVC 用に構築されているため、従う必要があります)。

于 2012-09-04T05:36:22.113 に答える