我有一個簡單的表單,我想驗證表單提交。請注意我已經剝離出來的HTML,以便於查看MVC驗證錯誤與強類型視圖
<%=Html.TextBox("LastName", "")%> //Lastname entry
<%=Html.ValidationMessage("LastName")%>
<%=Html.TextBox("FirstName", "")%>//Firstname entry
<%=Html.ValidationMessage("FirstName")%>
<%=Html.DropDownList("JobRole", Model.JobRoleList)%> //Dropdownlist of job roles
<% foreach (var record in Model.Courses) // Checkboxes of different courses for user to select
{ %>
<li><label><input type="checkbox" name="Courses" value="<%=record.CourseName%>" /><%= record.CourseName%></label></li>
<% } %>
在提交此申請表的,我想檢查兩個FirstName
和LastName
被填充(即非0的長度)。
在我的控制,我有:
public ActionResult Submit(string FirstName, string LastName)
{
if (FirstName.Trim().Length == 0)
ModelState.AddModelError("FirstName", "You must enter a first name");
if (LastName.Trim().Length == 0)
ModelState.AddModelError("LastName", "You must enter a first name");
if (ModelState.IsValid)
{
//Update database + redirect to action
}
return View(); //If ModelState not valid, return to View and show error messages
}
不幸的是,這種代碼邏輯產生,說明沒有對象被發現JobRole
和Courses
錯誤。
如果我刪除下拉列表和複選框,那麼一切正常。
的問題似乎是,當我返回View
視圖期待的對象爲dropwdownlist和複選框(這是明智的,因爲這是什麼,在我看來代碼)
我怎樣才能解決這個問題?
事情我已經考慮:
- 在我的控制,我可以創造一個
JobRoleList
對象和Course
對象傳遞給視圖,以便它有渲染的對象。與此相關的問題是它將覆蓋用戶已經做出的任何下拉列表/複選框選擇。 - 在我的控制器方法
Submit
的參數中,我可以同時捕獲JobRoleList
對象和Course
對象以傳遞迴視圖。再次,不確定這將捕獲用戶已經選擇的任何項目。
我已經做了很多谷歌搜索和閱讀,但我找不到一個好的答案。當我在書籍或在線(例如Nerddinner)中查看示例時,所有驗證示例都涉及帶有TextBox輸入的簡單表單,並且似乎並未顯示具有多個複選框和下拉列表的實例。
我在這裏遺漏了一些明顯的東西嗎?在這種情況下最好的做法是什麼?
感謝
感謝啓用驗證。我已經採用了你的方法,現在事情都很好。它確實覺得我的ViewModel有點臃腫,我可能會或可能不會使用數據,但對於我所做的事情,我不認爲它會給我帶來任何問題。感謝您花時間爲我提供建議。 – 2010-06-03 20:20:58
@ Remnant-正如我所說的,你可以有獨立的模型(在適當的情況下使用子類化)來顯示/發佈,但是當你發生錯誤時,你需要一種方法在它們之間進行轉換,而不是僅填充缺失的位。 – tvanfosson 2010-06-03 21:05:40