Asp.net mvc 2 是否可以在RedirectToRouteResult中将对象作为路由值发送?

Asp.net mvc 2 是否可以在RedirectToRouteResult中将对象作为路由值发送?,asp.net-mvc-2,asp.net-mvc-routing,Asp.net Mvc 2,Asp.net Mvc Routing,首先,它需要创建一些代码来处理我的应用程序中的任何错误,如下面的代码 public class HandleSomeErrorAttribute : HandleErrorAttribute { public string ControllerName { get; set; } public string ActionName { get; set; } public override void OnException(ExceptionContext filterC

首先,它需要创建一些代码来处理我的应用程序中的任何错误,如下面的代码

public class HandleSomeErrorAttribute : HandleErrorAttribute
{
    public string ControllerName { get; set; }
    public string ActionName { get; set; }

    public override void OnException(ExceptionContext filterContext)
    {
        base.OnException(filterContext);

        if(filterContext.Result != null)
        {
            var viewResult = filterContext.Result as ViewResult;

            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(
                 new
                 {
                     controller = ControllerName,
                     action = ActionName,
                     errorInfo = "test"
                 }
            ));
        }
    }
}
如果我将测试作为errorInfo值发送,则一切正常。另一方面,如果我发送一些errorInfo对象作为errorInfo值,action controller将不会收到任何errorInfo值。它总是空的

我知道此行为旨在处理用户提交表单时由web浏览器发送的表单集合中的任何值。所以,它总是只读字符串值并将其解析为对象

那么,有可能做到这一点吗


谢谢,没有。重定向会向浏览器返回一个字符串,通知它应该获取的页面和查询参数。你可以而且应该!用小提琴看这个。因此,在重定向中输入的任何内容都必须可以从字符串序列化到字符串。

否。重定向会向浏览器返回一个字符串,通知它应该获取的页面和查询参数。你可以而且应该!用小提琴看这个。所以,在重定向中输入的任何内容都必须可以从字符串序列化。

在中搜索了一些相关问题后,我才意识到ASP.NET中的任何重定向操作都会发送到浏览器。之后,浏览器将创建新请求以获取可在中找到的新URL

因此,若不将任何复杂对象序列化到浏览器并命令浏览器将其发送回服务器,则不可能直接发送任何复杂对象。虽然,这是可能的,但我认为这样做太愚蠢了。因为您可以使用以下代码调用另一个操作,而无需发送到浏览器

public class TransferResult : ActionResult
{
    public TransferResult(string controllerName, string actionName, RouteValueDictionary routeValues = null)
    {
        RouteValues = routeValues ?? new RouteValueDictionary();

        if (!string.IsNullOrEmpty(controllerName))
        {
            RouteValues[MvcApplication.ControllerRouteKey] = controllerName;
        }

        if (!string.IsNullOrEmpty(actionName))
        {
            RouteValues[MvcApplication.ActionRouteKey] = actionName;
        }

        if(RouteValues[MvcApplication.ControllerRouteKey] == null)
        {
            throw new ArgumentException(Resources.ControllerNameIsNotFoundInRouteValueDictionary, "controllerName");
        }

        if (RouteValues[MvcApplication.ActionRouteKey] == null)
        {
            throw new ArgumentException(Resources.ActionNameIsNotFoundInRouteValueDictionary, "actionName");
        }
    }

    public TransferResult(RouteValueDictionary routeValues)
        : this(null, null, routeValues)
    {
    }

    public RouteValueDictionary RouteValues { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        var routeData = new RouteData();

        foreach (var item in RouteValues)
        {
            routeData.Values.Add(item.Key, item.Value);   
        }

        var contextWrapper = new HttpContextWrapper(HttpContext.Current);
        var request = new RequestContext(contextWrapper, routeData);

        var controller = ControllerBuilder.Current.GetControllerFactory().CreateController(context.RequestContext, RouteValues[MvcApplication.ControllerRouteKey].ToString());
        controller.Execute(request); 
    }
} 
接下来,我创建一些句柄错误,用于处理某些错误类型并将其传输到另一个动作控制器

public class SomeHandleErrorAttribute : HandleErrorAttribute
{
    public SomeHandleErrorAttribute (string controllerName, string actionName)
    {
        ExceptionType = typeof (EntityException);
        ControllerName = controllerName;
        ActionName = actionName;
    }

    public string ControllerName { get; set; }
    public string ActionName { get; set; }

    public override void OnException(ExceptionContext filterContext)
    {
        base.OnException(filterContext);

        if(filterContext.Result != null)
        {
            var routeValue = new RouteValueDictionary
             {
                 {"errorInfo", filterContext}
             };

            filterContext.Result = new TransferResult(ControllerName, ActionName, routeValue);
        }
    }
}
最后,我创建了处理此错误的操作

public class ErrorController : Controller
{
    public string EntityError(ExceptionContext errorInfo)
    {
        return string.Format("Handle error for {0} ", errorInfo.Exception.Message);
    }
}

在搜索了一些相关问题后,我才意识到ASP.NET中的任何重定向操作都会发送到浏览器。之后,浏览器将创建新请求以获取可在中找到的新URL

因此,若不将任何复杂对象序列化到浏览器并命令浏览器将其发送回服务器,则不可能直接发送任何复杂对象。虽然,这是可能的,但我认为这样做太愚蠢了。因为您可以使用以下代码调用另一个操作,而无需发送到浏览器

public class TransferResult : ActionResult
{
    public TransferResult(string controllerName, string actionName, RouteValueDictionary routeValues = null)
    {
        RouteValues = routeValues ?? new RouteValueDictionary();

        if (!string.IsNullOrEmpty(controllerName))
        {
            RouteValues[MvcApplication.ControllerRouteKey] = controllerName;
        }

        if (!string.IsNullOrEmpty(actionName))
        {
            RouteValues[MvcApplication.ActionRouteKey] = actionName;
        }

        if(RouteValues[MvcApplication.ControllerRouteKey] == null)
        {
            throw new ArgumentException(Resources.ControllerNameIsNotFoundInRouteValueDictionary, "controllerName");
        }

        if (RouteValues[MvcApplication.ActionRouteKey] == null)
        {
            throw new ArgumentException(Resources.ActionNameIsNotFoundInRouteValueDictionary, "actionName");
        }
    }

    public TransferResult(RouteValueDictionary routeValues)
        : this(null, null, routeValues)
    {
    }

    public RouteValueDictionary RouteValues { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        var routeData = new RouteData();

        foreach (var item in RouteValues)
        {
            routeData.Values.Add(item.Key, item.Value);   
        }

        var contextWrapper = new HttpContextWrapper(HttpContext.Current);
        var request = new RequestContext(contextWrapper, routeData);

        var controller = ControllerBuilder.Current.GetControllerFactory().CreateController(context.RequestContext, RouteValues[MvcApplication.ControllerRouteKey].ToString());
        controller.Execute(request); 
    }
} 
接下来,我创建一些句柄错误,用于处理某些错误类型并将其传输到另一个动作控制器

public class SomeHandleErrorAttribute : HandleErrorAttribute
{
    public SomeHandleErrorAttribute (string controllerName, string actionName)
    {
        ExceptionType = typeof (EntityException);
        ControllerName = controllerName;
        ActionName = actionName;
    }

    public string ControllerName { get; set; }
    public string ActionName { get; set; }

    public override void OnException(ExceptionContext filterContext)
    {
        base.OnException(filterContext);

        if(filterContext.Result != null)
        {
            var routeValue = new RouteValueDictionary
             {
                 {"errorInfo", filterContext}
             };

            filterContext.Result = new TransferResult(ControllerName, ActionName, routeValue);
        }
    }
}
最后,我创建了处理此错误的操作

public class ErrorController : Controller
{
    public string EntityError(ExceptionContext errorInfo)
    {
        return string.Format("Handle error for {0} ", errorInfo.Exception.Message);
    }
}