【问题标题】:How to return different view, but presererve ViewModel in OnActionExecuting如何返回不同的视图,但在 OnActionExecuting 中保留 ViewModel
【发布时间】:2014-06-30 13:48:41
【问题描述】:

如果满足条件,我会尝试返回不同的视图。我想保留从操作传递到视图中的模型。

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var subAction = filterContext.RequestContext.RouteData.Values["subaction"].ToString();
        var action = filterContext.RequestContext.RouteData.Values["action"].ToString();

        if (!string.IsNullOrEmpty(subAction))
        {
            var view = (ViewResultBase) (filterContext.Result);
            filterContext.Result = View(action + subAction, view.ViewData.Model);
        }

        base.OnActionExecuting(filterContext);
    }

这样做时,我得到一个“Object reference not set to an instance of an object.”。很明显,Model 还没设置好?

我这样做的原因是我想让视图的命名尽可能简单。我的 URL 如下所示:/Global/Modules/Admin/Users/Create。这将返回视图“UsersCreate”。哪个有效。但是模型要么为空,要么为空!

更新

其实。它刚刚击中了我。行为是正确的。因为我只返回一个视图。该操作永远不会执行。用户操作被执行,但返回视图用户创建。我怎样才能做一个 RedirectToAction 有点事情,而不实际重定向。

【问题讨论】:

    标签: asp.net-mvc viewmodel


    【解决方案1】:

    OnActionExecuting 在操作之前运行,因此尚不存在模型。您可以尝试使用OnActionExecuted,一旦操作返回ActionResult,就会调用它。

    【讨论】:

    • 但是改变视图为时已晚。我得到一个The model item passed into the dictionary is of type[..]。传递的数据是用户列表。我正在传递一个视图模型类UsersCreate。用户列表是Users 视图的模型。
    • 其实。它刚刚击中了我。行为是正确的。因为我只返回一个视图。 Action 永远不会被执行。 Users 操作被执行,但返回视图 UsersCreate。我怎么能做 RedirectToAction 有点事情,而不实际重定向。
    【解决方案2】:
    public override void OnActionExecuting(ActionExecutingContext filterContext)
     {
        ...
        if (needToRedirect)
        {
           ...
           filterContext.Result = new RedirectResult(url);
           return;
        }
        ...
     }
    

    【讨论】:

      猜你喜欢
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      相关资源
      最近更新 更多