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);
}