【发布时间】:2011-03-13 02:14:08
【问题描述】:
也许这不是我需要的解决方案,但这是我想做的:
我有一个公司注册表,每个公司都需要一个管理用户。管理用户可以管理多个公司,因此在公司注册表单中,您可以从下拉列表中选择现有用户。
公司视图模型如下所示:
public class CompanyViewModel {
[Required]
public string Name { get; set; }
// other properties...
public UserViewModel Administrator { get; set; }
public IEnumerable<UserViewModel> AvailableUsers { get; set; }
}
用户视图模型如下所示:
public class UserViewModel {
[Required]
public string UserName { get; set; }
[Required]
public string Password { get; set; }
// other properties...
}
在公司注册视图中:
<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>
通过javascript,基于单选按钮选择,禁用下拉列表并显示新用户表单,或者隐藏新用户表单并启用下拉列表。
问题出在控制器按保存后的保存操作中,如果选择了现有用户并且没有在表单上填写数据,则 ModelState.IsValid 为 false。如果用户选择输入新用户,则验证成功。
处理此问题的最佳方法是什么?
一种选择是将所有用户的所有数据加载到 javascript 中的数据结构中,当现有用户下拉列表中的值发生变化时,可以填充隐藏的“新建”表单字段。但这似乎很蹩脚,因为密码将以纯文本形式放置在 html 中。一旦保存了新用户,我可以变得更高级并将 ajax 用于“创建新”表单并在原始表单上填充用户 ID,但如果可能的话,我希望将其全部保存在一个表单中。
似乎我希望能够从数据库加载现有用户数据并在控制器保存操作中填充模型状态,但是手动编写此代码(即使使用反射)似乎很草率。如果有内置的方法可以做到这一点,那就太好了。
有什么想法吗?
谢谢。
【问题讨论】:
标签: asp.net-mvc model-view-controller