【问题标题】:ASP.Net MVC return View with new Instance of Model instead of using Redirect To ActionASP.Net MVC 使用新的模型实例返回视图,而不是使用重定向到操作
【发布时间】:2011-01-06 21:49:46
【问题描述】:

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

如果数据库上的所有操作都成功,我想刷新视图。我从“添加”操作中创建了一个新的 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);

        }

【问题讨论】:

  • 你能发布你目前正在做的事情的代码吗?

标签: asp.net-mvc view


【解决方案1】:

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

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

【讨论】:

  • 因为这是我的第一个 MVC 项目,所以我想坚持最好的方法,并且 post-redirect-get 似乎是正确的方法。谢谢
【解决方案2】:

您的模型正在正常刷新。

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

您几乎别无选择,只能自己清除 ModelState 或手动更改 ModelState 条目。

【讨论】:

  • 你会考虑使用 Clear 方法安全吗。它可以满足我的需要。
  • 我会在适当的时候使用它。
【解决方案3】:

是填充了 values 属性,还是浏览器“自动填充”了表单?

RedirectToAcction 将导致 302 响应,然后是新表单的新“Get”。

【讨论】:

  • 我在第一次实例化视图模型时填充了一些值,并且我希望不再查询相同的值。这就是为什么我不想去新操作并用参数(来自发布的视图模型)填充新的“视图模型”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2011-03-20
相关资源
最近更新 更多