-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathControllerActionBase.cs
More file actions
107 lines (88 loc) · 3.9 KB
/
ControllerActionBase.cs
File metadata and controls
107 lines (88 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
namespace TestStack.FluentMVCTesting.MvcPipeline
{
public abstract class ControllerActionBase
{
protected ControllerActionBase()
{
FilterProviders = new FilterProviderCollection(System.Web.Mvc.FilterProviders.Providers);
Cookies = new Collection<HttpCookie>();
Session = new Dictionary<string, object>();
Files = new Dictionary<string, Stream>();
Resolve = DependencyResolver.Current.GetService;
}
public FilterProviderCollection FilterProviders { get; private set; }
public IPrincipal User { get; set; }
public IValueProvider ValueProvider { get; set; }
public ICollection<HttpCookie> Cookies { get; private set; }
public IDictionary<string, object> Session { get; private set; }
public IDictionary<string, Stream> Files { get; private set; }
public IDictionary<string, string> Form { get; private set; }
public Func<Type, object> Resolve { get; set; }
public string HttpMethod { get; set; }
public string UriPath { get; set; }
public abstract ActionContext GetActionContext(HttpContextBase httpContext = null);
public virtual ControllerActionResult Execute(HttpContextBase httpContext = null)
{
var actionContext = GetActionContext(httpContext ?? CreateHttpContext());
return Execute(actionContext.ControllerContext, actionContext.ActionDescriptor);
}
protected virtual ControllerActionResult Execute(ControllerContext controllerContext, System.Web.Mvc.ActionDescriptor actionDescriptor)
{
var invoker = GetActionInvoker(controllerContext, actionDescriptor);
return new ControllerActionResult
{
ControllerContext = controllerContext,
ActionResult = invoker.InvokeAction()
};
}
internal virtual MvcActionInvoker GetActionInvoker(ControllerContext controllerContext,
System.Web.Mvc.ActionDescriptor actionDescriptor)
{
var filters = FilterProviders.GetFilters(controllerContext, actionDescriptor).Select(BuildUp);
return new MvcActionInvoker(controllerContext, actionDescriptor, filters);
}
protected virtual Filter BuildUp(Filter filter)
{
if (Resolve == null)
return filter;
foreach (PropertyDescriptor propertyDesc in TypeDescriptor.GetProperties(filter.Instance))
{
var typeNames = propertyDesc.Attributes.OfType<Attribute>().Select(e => e.GetType().ToString());
if (typeNames.Contains("Microsoft.Practices.Unity.DependencyAttribute"))
{
var service = Resolve(propertyDesc.PropertyType);
if (service != null)
propertyDesc.SetValue(filter.Instance, service);
}
}
return filter;
}
public virtual ActionResult Authorize()
{
var actionContext = GetActionContext(CreateHttpContext());
return Authorize(actionContext.ControllerContext, actionContext.ActionDescriptor);
}
protected virtual ActionResult Authorize(ControllerContext controllerContext, System.Web.Mvc.ActionDescriptor actionDescriptor)
{
return GetActionInvoker(controllerContext, actionDescriptor).AuthorizeAction();
}
public abstract HttpContextBase CreateHttpContext();
}
[Serializable]
public class ControllerActionException : Exception
{
public ControllerActionException(string message)
: base(message)
{
}
}
}