MVC 3 CookieTempDataProvider и Ninject IOC
Я пытаюсь использовать CookieTempDataProvider в сборке фьючерсов MVC 3. Я полагаю, что я "связал" это успешно, используя ninject. Ниже приведен код из моего файла app_start.cs:
[сборка: WebActivator.PreApplicationStartMethod(typeof(Web.AppStart), "Start")] пространство имен Web {открытый статический класс AppStart {открытый статический void RegisterServices(ядро IKernel) {
kernel.Bind<ITempDataProvider>().To<CookieTempDataProvider>();
}
public static void Start() {
// Create Ninject DI Kernel
// IKernel kernel = new StandardKernel();
IKernel kernel = Container;
// Register services with our Ninject DI Container
RegisterServices(kernel);
// Tell ASP.NET MVC 3 to use our Ninject DI Container
DependencyResolver.SetResolver(new NinjectServiceLocator(kernel));
}
static IKernel _container;
public static IKernel Container
{
get
{
if (_container == null)
_container = new StandardKernel();
return _container;
}
}
Однако, когда я получаю доступ к своей странице, которая использует TempData, я получаю эту ошибку, указывающую, что она все еще пытается использовать SessionTempDataProvider:
Ошибка сервера в приложении '/' Класс SessionStateTempDataProvider требует, чтобы состояние сеанса было включено. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.InvalidOperationException: класс SessionStateTempDataProvider требует, чтобы состояние сеанса было включено.
Я, должно быть, что-то упустил, и я не могу понять, что это такое. Любая помощь будет наиболее ценной.
Большое спасибо
2 ответа
Расширить класс контроллера
public static void SetMessage(this Controller controller, String message) { controller.TempData["Messag"] = message; }
Тогда вы можете использовать это так:
public ActionResult Save() { //Validation... Save(Foo); this.SetMessage("Item saved successfully"); return Redirect("/Site"); }
Нет номер три:)
Я только смог заставить это работать с подходом BaseController. Процессы создания контроллера не запрашивают у Ninject ITempDataProvider.
public class BaseController : Controller
{
protected override ITempDataProvider CreateTempDataProvider()
{
return new CookieTempDataProvider(HttpContext);
}
}