2012-12-07 44 views
0

在我的第一個MVC 4應用程序上工作,我的登錄屏幕出現問題。這是一個內部網應用程序,適用於在生產車間使用普通PC的公司,因此他們需要能夠以個人身份登錄應用程序。 (該網站也在jQuery手機,並有一個JavaScript觸摸鍵盤,但我不認爲他們需要參與這個問題)回發後調用登錄屏幕javascript?

問題是,如果有人未能登錄,設置它的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.AddModelErrorReturn View(model))被髮回到輸入新聞腳本已被加載的頁面的版本?

我覺得我錯過了一些基本的東西。感謝任何人可以給的幫助。否則,它是setTimeout。 〜Ed

回答

0

我認爲jQueryMobile可能是你的問題 - 默認情況下,jqm使用ajax提交所有表單,所以你沒有得到完整的回發。我遇到了類似的問題,這是根本原因。

嘗試使用過載Html.BeginForm並添加new {data_ajax="false"}到HttpAttributes

+0

這引起了它 - 感謝!用'@Using Html.BeginForm(「LogOn」,「Account」,Nothing,FormMethod.Post,New With {.data_ajax =「false」})替換'@Using Html.BeginForm()'',現在一切都表現得很好。 – edhubbell