如何返回不同的视图,但在OnActionExecuting中预先设置ViewModel

时间:2010-02-16 07:54:20

标签: asp.net-mvc viewmodel

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

    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.”。显然,该模型尚未设定?

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

更新

实际上。它只是打击了我。行为是正确的。因为我只返回一个视图。该动作永远不会执行。执行Users-action,但返回视图UsersCreate。如何在没有实际重定向的情况下进行RedirectToAction。

2 个答案:

答案 0 :(得分:1)

OnActionExecuting在操作之前运行,因此还没有模型存在。您可以尝试使用OnActionExecuted,该操作会在操作返回ActionResult后调用。

答案 1 :(得分:0)

public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }