Дополнительный Человек Метода к спасению!
/// <summary>
/// Adds all given items to the collection
/// </summary>
/// <param name="collection">The collection.</param>
/// <param name="toAdd">Objects to add.</param>
public static void AddAll<T>(this IList<T> collection, params T[] toAdd)
{
foreach (var o in toAdd)
collection.Add(o);
}
Я бы порекомендовал поместить его в данные маршрута.
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.RouteData.Values.Add("test", "TESTING");
base.OnActionExecuting(filterContext);
}
public ActionResult Index()
{
ViewData["Message"] = RouteData.Values["test"];
return View();
}
Вы можете использовать HttpContext
:
filterContext.HttpContext.Items["criteria"] = criteria;
И вы можете прочитать его в действии:
[YourActionFilter]
public ActionResult SomeAction()
{
var criteria = HttpContext.Items["criteria"] as DetachedCriteria;
}
Установите элемент в ViewData или в модели просмотра, если вы передаете его как параметр в свое действие. Здесь я устанавливаю свойство ViewModel
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
ViewModelBase viewModel = null;
foreach (object parameter in filterContext.ActionParameters.Values)
{
if (parameter is ViewModelBase)
{
viewModel = (ViewModelBase)parameter;
break;
}
}
if(viewModel !=null)
{
viewModel.SomeProperty = "SomeValue";
}
}
public ActionResult About(ViewModelBase model)
{
string someProperty= model.SomeProperty;
}
Вот нетипизированная версия, которую, я думаю, вы предпочитаете:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewData.Add("TestValue", "test");
}
[FilterWhichSetsValue]
public ActionResult About()
{
string test = (string)ViewData["TestValue"];
return View();
}