也許這是不完全的解決方案,我需要的,但是這是我想做的事:如何填充在控制器的數據和避免的ModelState錯誤
我有一個公司的登記表,每家公司需要管理用戶。管理用戶可能會管理多個公司,因此在公司註冊表單中,您可以從下拉菜單中選擇一個現有用戶。
公司視圖模型看起來是這樣的:
public class CompanyViewModel {
[Required]
public string Name { get; set; }
// other properties...
public UserViewModel Administrator { get; set; }
public IEnumerable<UserViewModel> AvailableUsers { get; set; }
}
和用戶視圖模式是這樣的:
<div><input type="radiobutton" name="chooseuser" id="existing"/>Choose an Existing User:</div.
<div>@Html.DropDownListFor(m => m.Administrator.Id, Model.AvailableUsers.Select(u => new SelectListItem { Text = string.Format("{0} - {1} {2}", u.UserName, u.FirstName, u.LastName), Value = u.Id.ToString() }), "<Choose existing user>", new { id = "existingusers" })
</div>
<div><input type="radiobutton" name="chooseuser" id="createnew"/>Create a new User:</div>
<div><label>Username:</label> @Html.EditorFor(m => m.Administrator.UserName)</div>
:
public class UserViewModel {
[Required]
public string UserName { get; set; }
[Required]
public string Password { get; set; }
// other properties...
}
在公司登記觀點
通過JavaScript,基於單選按鈕選擇下拉列表將被禁用,並顯示新的用戶窗體,或者隱藏新的用戶窗體並啓用下拉列表。
的問題是在控制器中保存的動作按下保存後,如果選擇現有用戶並沒有數據填寫在表格上ModelState.IsValid是假的。如果用戶選擇輸入新用戶,則驗證成功。
什麼是處理這個問題的最好方法?
一個選項是所有用戶的所有數據加載到數據結構在JavaScript中,當現有用戶下拉列表中值的變化,可以填充隱藏的「創建新的」表單域。但這看起來很蹩腳,因爲密碼將以純文本形式存在於html中。一旦新用戶被保存,我可以更加友好並使用ajax創建新的表單,並在原始表單上填充用戶標識,但是如果可能的話,我希望將其全部保留在一個表單中。
似乎喜歡我理想情況下能夠從數據庫中加載現有的用戶數據並在控制器中保存模型狀態保存操作,但手動編寫此代碼(即使使用反射)似乎馬虎。如果有內置的方法來做到這一點會很好。
任何想法?
謝謝。