将模型状态错误传递给不同的操作方法

Posted

技术标签:

【中文标题】将模型状态错误传递给不同的操作方法【英文标题】:To pass a model State error to a different Action Method 【发布时间】:2019-12-02 18:51:01 【问题描述】:

我有一个动作方法如下:

[HttpPost]
public ActionResult Edit(EditViewModel model)

    if (ModelState.IsValid)
    
        //Do Something                
    
    var model1 = new IndexViewModel();
    ModelState.AddModelError("", "An error occurred while editing the user.");
    return RedirectToAction("Index", model1);

在验证错误时,我希望将其转移到下面的方法并出现模型状态错误。

[HttpGet]
public ActionResult Index(IndexViewModel model)

    IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);

我的 index.cshtml 定义了一个验证摘要以显示模型状态错误。

<div class="row">
    <div class="col-xs-12">
        @Html.ValidationSummary("", new  @class = "alert alert-danger validation" )
    </div>
</div>

有没有办法可以将模型状态错误从 Edit 方法传递到 index 方法并在加载索引屏幕时加载它?当前代码不起作用。 allErrors 字段为空,不包含任何添加的错误。

【问题讨论】:

看TempData。这就是它的人生目标。 【参考方案1】:

如您所见,将 ViewModel 传递给 RedirectToAction() 不会保留模型错误。正如@Shyju 在此post 中所提到的,RedirectToAction() 辅助方法会导致发出新的 GET 请求。但是,您可以使用TempData 将您的对象持久化到下一个操作方法。您可以使用以下代码来实现:

[HttpPost]
public ActionResult Edit(EditViewModel model)

     TempData["EditViewModel"] = model;

     if (ModelState.IsValid)
     
        //Do Something                
     
     var model1 = new IndexViewModel();
     ModelState.AddModelError("", "An error occurred while editing the user.");
     return RedirectToAction("Index", model1);




 [HttpGet]
public ActionResult Index(IndexViewModel model)

  model = TempData["IndexViewModel"] as IndexViewModel;                

  IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);

更多信息,你可以看看这个Post。

【讨论】:

以上是关于将模型状态错误传递给不同的操作方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中将验证错误传递给查看而不重定向

Aurelia验证 - 访问特定属性的验证错误的最佳方法是什么?

Apollo Client 2.1 中的突变错误处理

Spring MVC 验证错误代码在哪里解决?

Laravel 路由模型绑定 - Laravel 5.7

错误:一元“*”的类型参数无效(有“int”)