Asp.net mvc 2 MVC DropDownListFor-验证失败后,我必须手动重新填充选项吗?

Asp.net mvc 2 MVC DropDownListFor-验证失败后,我必须手动重新填充选项吗?,asp.net-mvc-2,Asp.net Mvc 2,我有一个viewmodel类,它包含两个属性。基本上是当前记录(用户正在编辑)和选项列表(用于使用DropDownListFor填充下拉列表) 提交表单后,如果modelstate无效,我将返回视图。我知道表单是使用来自ModelState[“name”].Value.AttemptedValue的“拒绝”输入填充的,但我不确定如何处理下拉列表中的值列表 如果我什么也不做,在验证失败并返回页面时,我会得到一个“对象引用未设置为对象实例”错误,因为viewmodel的list属性为null。我知道

我有一个viewmodel类,它包含两个属性。基本上是当前记录(用户正在编辑)和选项列表(用于使用DropDownListFor填充下拉列表)

提交表单后,如果modelstate无效,我将返回视图。我知道表单是使用来自
ModelState[“name”].Value.AttemptedValue
的“拒绝”输入填充的,但我不确定如何处理下拉列表中的值列表

如果我什么也不做,在验证失败并返回页面时,我会得到一个“对象引用未设置为对象实例”错误,因为viewmodel的list属性为null。我知道它是空的,因为它没有从表单post绑定,所以我可以在返回视图之前从数据库中重新填充它


这是正确的方法吗,还是我缺少了一种更明显的方法来保持下拉值?

是的,如果您打算在后期操作中返回相同的视图,这是正确的方法:

  • 绑定从数据库获取操作中的列表
  • 渲染视图
  • 用户将表单提交给POST操作
  • 在此操作中,您只获取所选的值,因此如果模型无效并且需要重新显示视图,则需要从数据库中获取列表以填充视图模型
  • 下面是MVC中常用模式的一个示例:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new MyViewModel
            {
                Items = _repository.GetItems()
            };
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(MyViewModel model)
        {
            if (!ModelState.IsValid) 
            {
                // Validation failed, fetch the list from the database
                // and redisplay the form
                model.Items = _repository.GetItems();
                return View(model);
            }
            // at this stage the model is valid => 
            // use the selected value from the dropdown
            _repository.DoSomething(model.SelectedValue);
            // You no longer need to fetch the list because
            // we are redirecting here
            return RedirectToAction("Success", "SomeOtherController");
        }
    }
    

    您可以使用xhr ajax调用提交数据,而不是通过表单的默认提交按钮提交表单

    这种技术的优点是不需要重新填充列表

    在客户端,在ajax回调之后,您可以通过检查
    状态
    值来决定做什么

    $.ajax({
        url: '@Url.Action("Index", "Controller")',
        data: $("#form").serialize(),
        type: 'POST',
        success: function (data) {
            if (data.status == "Successful") {
                // you can redirect to another page by window.location.replace('New URL')
            } else {
                // you can display validation message
            }
        }
    });
    
    您的操作方法如下所示:

    [HttpPost]
            public JsonResult Index()
            {
                if (ModelState.IsValid)
                {
                    return Json(new { status = "Success" });    
                }
                else
                {
                    return Json(new { status = "Fail" });
                }
            }
    

    谢谢这就是我使用的技术。仅仅是我自己在一个使用新技术的项目上工作,对照第二种意见检查是很好的!