ASP.Net MVC使用新的Model of Instance返回View,而不是使用Redirect To Action

时间:2011-01-06 21:49:46

标签: asp.net-mvc view

我有一个使用ViewModel的表单视图。 Action“New”呈现新视图。提交此表单后,我将信息发送回“添加”操作。

如果DB上的所有操作都成功,我想刷新视图。我从“添加”操作中创建了一个新的viewmodel实例,并返回View(“New”,viewModel)。这不会刷新我的观点。所有旧值(已提交)仍保留在视图中。 有没有办法在没有RedirectToAction方法的情况下刷新页面。

我在另一篇文章中读到不应该使用ModelState.Clear,因为它可能会产生不良结果。

谢谢,

编辑1 - 添加代码

New

 public ActionResult New(string id)
        {
            var sysId= new Guid(id);
.......
........

  string Details = pDto.Name + "(" + pDto.Code + ")";

            var vm= new ViewModel(id);
            vm.Details = Details;

            return View(vm);
        }



 public ActionResult Add(ViewModel vm)
        {
                        ViewModel vm= vm;

            if (ModelState.IsValid)
            {

                              var dto= _qRepository.GetFeaturesBy(viewModel.Code);

                if (dto!= null)
                {

                    ModelState.AddModelError("Code", "Code is already in Use.");

                    return View("New", viewModel);
                }

                _productService.AddFeature(..........);
               // ModelState.Clear();  -- this works          
                vm= new ViewModel(vm.pId) { Message = "Code" + viewModel.Code + " was added ......", Details = vm.Details };

            }


          return  View ("New", vm);

        }

3 个答案:

答案 0 :(得分:5)

您应该尝试遵守post-redirect-get模式。您没有的唯一一次是发布失败并且您想要返回验证错误,以便客户端可以重新发布表单。这是从post action方法返回视图时发生的情况。所有这些表单值仍然在ModelState中浮动,等待在表单上再次使用。

如果您想让用户立即添加其他项目,可以使用RedirectToAction("New")。此外,听起来两个操作都应该命名为New,然后用[HttpPost]属性和PostModel参数装饰帖子版本。如果你发布并在两个不同的动作之间进行操作,事情会变得混乱,因为那时你必须记住在html表单上明确设置动作,并且还要在验证失败时返回正确的视图。

答案 1 :(得分:4)

您的模型正在刷新。

问题是HTMLHelpers在使用您传递的新模型之前首先在ViewState和ModelState中查找数据。

你几乎没有选择但是要清除ModelState或自己手动更改ModelState条目。

答案 2 :(得分:0)

是填充了值属性的渲染,还是浏览器“自动填充”表单?

RedirectToAcction将导致302响应,然后新的“获取”到新表单。