Razor 将与表单无关的数据(如下拉选项)保存在controller';后动作
控制器:Razor 将与表单无关的数据(如下拉选项)保存在controller';后动作,razor,asp.net-mvc-5,unobtrusive-validation,Razor,Asp.net Mvc 5,Unobtrusive Validation,控制器: public ActionResult New() { var viewModel = new ViewModel(); viewModel.AllUsers = **Run a Database Query to get all users** return View(viewModel); } 视图: 问题是,如果ModelState无效,并且我使用viewModel返回视图,AllProjectUsersList为空。因此,在构建视图时会发生异常。当然,
public ActionResult New()
{
var viewModel = new ViewModel();
viewModel.AllUsers = **Run a Database Query to get all users**
return View(viewModel);
}
视图:
问题是,如果ModelState
无效,并且我使用viewModel
返回视图
,AllProjectUsersList
为空。因此,在构建视图时会发生异常。当然,我可以通过再次运行数据库查询并填充AllProjectUsersList
来解决这个问题
是否有任何方法可以保留以前填充的
AllProjectUsersList
或以其他方式避免数据库查询?如果您已实现了属性客户端验证,然后,ModelState
将很少无效。除非您为视图中的每个SelectListItem
创建一个输入,以便它发回(这将是疯狂的),否则不会。但是您可以始终在服务器上缓存数据。我已经为其中一个属性实现了自定义的验证程序。它的验证发生在服务器端,而不是客户端。这是错的吗?其验证是否可以在客户端进行(如RequiredAttribute
)?您的验证属性需要实现IClientValidable
,并且您需要编写脚本将规则添加到$.validator
。是为客户端和服务器端验证创建验证属性的好指南。哦!我真的以为自定义验证器只能在服务器端工作。非常感谢。另外,我们将研究在服务器上缓存下拉选项。
@using (Html.BeginForm("New", "Card", FormMethod.Post, new Dictionary<string, object>() { { "id", "cardForm" } }))
{
**Among other form fields***
<div class="control-group">
label class="control-label LabelStyle">
Assigned To
</label>
<div>
@Html.DropDownListFor(model => model.AssignedToIds, Model.AllProjectUsersList.ToSelectList(u => u.Id.ToString(), u => u.Text, u => u.Selected ), new { @class = "chosen", multiple = "multiple"})
</div>
</div>
}
<script>
var cardForm = $('#cardForm');
cardForm.submit();
</script>
[HttpPost]
public ActionResult New(CardFormViewModel viewModel)
{
if (ModelState.IsValid)
{
//Do Something
}
return View(viewModel);
}