2012-05-22 62 views
2

我們正在爲基本網站開發一些輔助功能標準,並且如果模型中定義的驗證失敗,需要將焦點返回到用戶名字段。我已經閱讀了幾篇文章,指出這是它存在的行爲。但是,這不是我們所看到的行爲。我打開MVC 3字段驗證專注於失敗

回答

3

我看了幾個帖子MVC natice功能(我們使用MVC 3剃鬚刀)或jQuery的),它們指出,這是因爲它存在

怪異的行爲,你在哪裏那些帖子?我建議你通知這些帖子的作者,這不是默認行爲。

當然,當某些東西不是默認行爲時,如果要實現它,則必須實現它。例如,如果存在多個錯誤,您還沒有完全指定它的行爲方式:哪個字段應該關注?首先?第三?第七?

讓我們假設你想專注於第一個。假設你正在使用jQuery,你可以添加以下內容到你的視圖中:

@if (!ViewData.ModelState.IsValid) 
{ 
    var key = ViewData 
     .ModelState 
     .Where(x => x.Value.Errors.Count > 0) 
     .Select(x => x.Key) 
     .FirstOrDefault(); 

    if (!string.IsNullOrEmpty(key)) 
    { 
     <script type="text/javascript"> 
      $(function() { 
       $(':input[[email protected](Json.Encode(key))]').focus(); 
      }); 
     </script> 
    } 
} 

你已經完成了很多工作。好吧,這個代碼的進一步改進,當然是將其外部化爲一個可重用的HTML幫助程序,以避免將您的觀點轉化爲絕對可怕的東西。例如,你可以擁有這將實現此行爲定製的幫手,所有你需要做的是以下內容添加到您的_Layout

public static class HtmlExtensions 
{ 
    public static IHtmlString FocusOnFirstError(this HtmlHelper htmlHelper) 
    { 
     if (htmlHelper.ViewData.ModelState.IsValid) 
     { 
      return MvcHtmlString.Empty; 
     } 

     var key = htmlHelper 
      .ViewData 
      .ModelState 
      .Where(x => x.Value.Errors.Count > 0) 
      .Select(x => x.Key) 
      .FirstOrDefault(); 

     if (string.IsNullOrEmpty(key)) 
     { 
      return MvcHtmlString.Empty; 
     } 

     var script = new TagBuilder("script"); 
     script.Attributes["type"] = "text/javascript"; 
     script.InnerHtml = string.Format(
      "$(function() {{ $(':input[name={0}]').focus(); }});", 
      Json.Encode(key) 
     ); 
     return new HtmlString(script.ToString(TagRenderMode.Normal)); 
    } 
} 
+0

@Html.FocusOnFirstError() 

可以用的東西沿着線來實現謝謝Darin!儘管[不必要的]諷刺,你給了我我需要的東西。傑出的職位。 – RockyMountainHigh