【问题标题】:Cleaning up post action in MVC清理 MVC 中的后期操作
【发布时间】:2012-06-29 13:34:26
【问题描述】:

我正在使用 PRG 来清理我在 MVC 中的帖子

在 POST 操作中,我使用操作过滤器将控制器模型状态存储在 tempdata 中,然后重定向到重新加载模型状态的 GET 方法。

GET 和 POST 操作标头:

[ImportModelStateFromTempData]
public ActionResult Details(int id) { 
    var object = load(id);
    return View(object);
}

[HttpPost]
[ExportModelStateToTempData]
public ActionResult Details(MyViewModel model) { 
    update(model); return RedirectToAction("Details", new { id = model.id }) 
}

如果发生错误,我在发布操作中添加一个错误到模型状态,这使模型状态无效,然后重定向到获取操作。

我的问题是如何才能最好地确定模型在发布后处于错误状态的 GET“详细信息”操作?如果模型状态无效,我想跳过逻辑...

var object = load(id);

在 GET 操作中。我试过 ModelState.IsValid 但这不起作用。

【问题讨论】:

  • 您可以询问 Modelstate 是否有效(它会根据数据注释检查自己): if (!ModelState.IsValid) { //do your thing }。您还可以为“特殊”验证添加自己的模型状态错误:ModelState.AddModelError(yourProperty, aMessage);..虽然我不确定我是否真的理解您的问题..
  • @Team-JoKi 他正在使用从 POST 请求导入 TempData 的操作过滤器,因此他遵循 PRG 模式。 POST 到一个动作并且 ModelState 有效,将模型状态推送到 TempData 中,然后重定向到 GET 动作,然后将导入该 ModelState 以便表单突出显示适当的验证器,等等。
  • 您不应该只测试“如果 modelState.IsValid ... 进行重定向”,否则只需将模型返回到您所在的视图?您想在运行任何更新之前测试有效性

标签: c# asp.net-mvc post-redirect-get


【解决方案1】:

你可以试试这样的:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    ModelStateDictionary modelState = filterContext.Controller.TempData[Key] as ModelStateDictionary;

    if( !modelState.IsValid )
    {
        filterContext.Controller.TempData.Add("IsValid", false);
    }
}

在您的控制器中,您可以检查 TempData["IsValid"] 字段而不是 ModelState.IsValid:

if( TempData["IsValid"] != null ) // do whatever here, or skip code etc.

请注意 OnActionExecuting 方法中的操作过滤器代码。您将在 OnActionExecuted 中保留现有代码:

public void OnActionExecuting(ActionExecutingContext filterContext)
{         ModelStateDictionary modelState = filterContext.Controller.TempData[Key] as ModelStateDictionary;

    if (modelState != null)
    {
        if (filterContext.Result is ViewResult)
        {
            filterContext.Controller.ViewData.ModelState.Merge(modelState);
        }
        else
        {
            filterContext.Controller.TempData.Remove(Key);
        }
    }
}

【讨论】:

  • 考虑存储 TempData[key] 以替代检查 Modelstate.IsValid 但想知道是否有不同的方法。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多