0

最初のMVC4アプリで作業していますが、ログイン画面に問題があります。これは、製造現場に一般的なPCを設置している企業向けのイントラネットアプリであるため、アプリに個別にログインできる必要があります。(このサイトもjQuery mobileにあり、Javascriptタッチキーボードがありますが、この質問に関与する必要はないと思います)

問題は、誰かがログインに失敗した場合、[ユーザー名]フィールドにEnterキーを押してフォーカスを[パスワード]フィールドに送信するように設定するJavascriptコードが機能しなくなることです。

(setTimeout、100を使用して)機能するハックがありますが、それは私を不快で汚く感じさせます。

これが私のログオンフォームです:

@ModelType FAToolAdmin.LogOnModel

@Code
    ViewData("Title") = "Log In"
End Code


@Using Html.BeginForm()
    @<div class="content-primary">

        <div data-role="header" data-position="fixed" data-theme="b">
            <h2>Account Info</h2>
        </div>
            
        <fieldset>
            <div class="editor-label">
                @Html.LabelFor(Function(m) m.UserName)
            </div>

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

            <div class="editor-label">
                @Html.LabelFor(Function(m) m.Password)
            </div>

            <div class="editor-field">
                @Html.EditorFor(Function(m) m.Password)
            </div>

            <p>
                <input type="submit" value="Log In" class="notfocus"/>
            </p>

            @* This Html.ValidationSummary will show a ul element containing any login errors that were returned.  
                The call here has been edited to send an empty string, because sending 2 lines of text regarding 
                a login failure is a little excessive.  You failed to login.  Type everything again and move on 
                with your day.*@

            @Html.ValidationSummary(True, "")

        </fieldset>
    </div>

End Using

<script type="text/javascript">

    //This is the script that adds the keyboards to the screen.

    $(function () {
        //setTimeout(function () {

            //This is the script that makes it so that when the enter button is pressed on the screen that the 
            //focus is changed to the password box (rather than having the form be submitted).

            // set the focus to the UserName field and select all contents
            $('#UserName').focus().select();
            // bind the keypress event on the UserName field to this little piece of code here
            var $inp = $('#UserName');
            $inp.bind('keydown', function (e) {
                var key = e.which;
                // if this is keycode 13 (enter), then prevent the default form behavior and change focus to the Password box.
                if (key == 13) {
                    e.preventDefault();
                    // find the Password input box and set the focus to it.
                    $('#Password').focus();
                }
            });
        //}, 100);
    });

</script>

これが私のコントローラーです:

Imports System.Diagnostics.CodeAnalysis
Imports System.Security.Principal
Imports System.Web.Routing

Public Class AccountController
    Inherits System.Web.Mvc.Controller

    ' GET: /Account/LogOn
    <AllowAnonymous()>
    Public Function LogOn() As ActionResult
        Dim model As New LogOnModel
        Return View(model)
    End Function

    '
    ' POST: /Account/LogOn
    <AllowAnonymous()>
    <HttpPost()>
    Public Function LogOn(ByVal model As LogOnModel, ByVal returnUrl As String) As ActionResult
        Try
            If ModelState.IsValid Then

                If Membership.ValidateUser(model.UserName, model.Password) Then

                    FormsAuthentication.SetAuthCookie(model.UserName, False)
                    If Url.IsLocalUrl(returnUrl) AndAlso returnUrl.Length > 1 AndAlso returnUrl.StartsWith("/") _
                       AndAlso Not returnUrl.StartsWith("//") AndAlso Not returnUrl.StartsWith("/\\") Then
                        Return Redirect(returnUrl)
                    Else
                        Return RedirectToAction("Index", "Home")
                    End If
                Else
                    ModelState.AddModelError("", "The user name or password provided is incorrect.")
                End If
            Else
                ' if you just click on login without ever having entered anything into the username and password fields, you'll get this message.
                ModelState.AddModelError("", "Please enter a valid user name and password.")
            End If

        Catch ex As Exception
            MsgBox(ex.Message)

        End Try

        ' If we got this far, something failed, redisplay form
        Return View(model)

    End Function

    '
    ' GET: /Account/LogOff
    <AllowAnonymous()>
    Public Function LogOff() As ActionResult
        FormsAuthentication.SignOut()
        Session.Abandon()
        Return (RedirectToAction("Index", "Home"))
    End Function

End Class

およびモデル:

Public Class LogOnModel

    <Required()> _
    <Display(Name:="SomeCompany Username")> _
    Public Property UserName() As String

    <Required()> _
    <DataType(DataType.Password)> _
    <Display(Name:="Password")> _
    Public Property Password() As String

End Class

ModelState.AddModelErrorだから私の質問は、間違ったユーザー名を入力した(したがってとをトリガーするReturn View(model))誰かがEnter Pressスクリプトがロードされたバージョンのページに送り返されるように設定するにはどうすればよいですか?

根本的な何かが欠けているような気がします。誰かが与えることができるどんな助けにも感謝します。そうでなければ、そうsetTimeoutです。

4

1 に答える 1

0

jQueryMobileが問題かもしれないと思います-jqmはデフォルトでajaxを使用してすべてのフォームを送信するため、完全なポストバックは得られません。私は同様の問題に遭遇し、それが根本的な原因でした。

にオーバーロードを使用して、HttpAttributesHtml.BeginFormに追加してみてくださいnew {data_ajax="false"}

于 2012-12-07T21:13:32.907 に答える