2012-04-16 78 views
0

我有一個頁面與一些服務器端驗證。它的工作原理是,在服務器驗證失敗的情況下,它會顯示相同的頁面,並在驗證錯誤的上方輸入數據。返回視圖,但也跳轉到div

我的問題是,有一大堆其他的東西在頁面的頂部,所以用戶沒有定向到錯誤框,實際上它可能是在屏幕外。錯誤在#server_errors中。我想要的是告訴控制器返回視圖,但跳轉到錯誤部分,就像將#server_errors附加到url一樣。

控制器返回這樣的:

public ActionResult ChangeRiskCategory(Guid id) 
{ 
    //... 
    //call server side method, handle errors 
    //... 
    return View("ChangeRiskCategory", changeRiskCategoryModel); 
} 

,我看不到的方式來注入DIV ID爲在這一點上的看法。我可以看到,驗證客戶端可以解決這個問題,但它需要在沒有啓用js的情況下工作,所以我認爲這些規則已經出來。

+1

好吧,我可以看到在客戶端自動滾動到錯誤摘要或在第一個錯誤使用JS窗體,但是因爲這一切都需要JavaScript,所以不能在禁用JS的情況下工作。在URL中獲取哈希標記(#server_errors)的唯一方法是做重定向,但即使這也有其侷限性 – 2012-04-16 14:18:39

回答

1

你可以試試這樣的事情:

public ActionResult ChangeRiskCategory(Guid id, bool error = false) 
{ 
    //... 
    //call server side method, handle errors 
    //... 
    if (!error && !ModelState.IsValid /*or other way of working out the error will be displayed*/) 
    { 
     return Redirect(Url.Action("ChangeRiskCategory") + "?id=" + id + "&error=true#server_error"); 
    } 
    return View("ChangeRiskCategory", changeRiskCategoryModel); 

} 

(「錯誤」參數是無休止地停止redir ecting)

如果你改變主意有關使用JavaScript,你可以簡單地發出:

location.href='#server_errors'; 
+0

值得注意的是,這可能會導致您的驗證邏輯和頁面加載每次運行失敗兩次,所以雖然此解決方案回答了我建議只在「全部否則就會失敗「的情況,因爲它效率低很多。考慮檢測JS是否被禁用,並且僅在此實例中執行服務器端重定向以緩解此問題。 – 2012-04-26 08:50:16

1

將div id作爲ViewModel的屬性傳遞給View有什麼用處?然後,您可以在視圖中以Javascript使用任何您想做的事情。畢竟,ViewModel表示視圖的數據和狀態。

基於
+0

感謝Dante,理想情況下,我正在尋找一些無js的工作。 – 2012-04-16 14:19:10

+0

沒注意到那部分,對不起。 – Dante 2012-04-16 14:21:49

0

使用模型驗證,並查看這個樣子

@model SampleApplication.Models.BasicDemoModel 

<form id="AjaxForm" action="/"> 
    <table> 
     <tr> 
      <td>@Html.LabelFor(x => x.Name)</td> 
      <td> 
       @Html.TextBoxFor(x => x.Name) 
       @Html.ValidationMessageFor(x => x.Name, "*") 
      </td> 
     </tr> 
     <tr> 
      <td>@Html.LabelFor(x => x.Email)</td> 
      <td> 
       @Html.TextBoxFor(x => x.Email) 
       @Html.ValidationMessageFor(x => x.Email, "*") 
      </td> 
     </tr> 
     @{ 
      Html.RenderPartial("Address", Model); 
     } 
    </table> 
    @if (!string.IsNullOrWhiteSpace(Model.Message)) 
    { 
     <h2>@Model.Message</h2> 
    } 
    @if (!ViewContext.ViewData.ModelState.IsValid) 
    { 
     @Html.ValidationSummary() 
    } 
    <input type="submit" title="Submit Form" onclick="PostFormWithAjax();return false;" /> 
</form> 

,如果你需要額外的驗證消息,你可以將它添加到更多的國家這樣

public ActionResult ChangeRiskCategory(Guid id) 
{ 
    //... 
    //call server side method, handle errors 
    //... 
    ModelState.AddModelError("MyInput","This isn't Right"); 
    return View("ChangeRiskCategory", changeRiskCategoryModel); 
} 
+0

我無法讓您的鏈接工作 – 2012-04-16 15:15:11