我可能在这里做了一些完全错误的工作,但由于某种原因,我在其中一个页面中获得的这种表单的值在第一篇文章后得到了缓存。这不是浏览器,因为即使我打开不同的浏览器,发布的值仍然被缓存。ASP.NET MVC:表单值在第一篇文章后得到缓存
我的形式非常简单:
<form action="/post/save" method="post">
<label>Type here whatever you want, quick and without thinking</label>
<%= Html.TextArea("Body", new { @class = "post", rows="3" })%>
<input type="submit" value="Publish" class="big_button red" />
</form>
我控制器操作更简单:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(ArticleView form)
{
Article article = _ArticleViewMapper.Map(form);
article.UpdatedBy = "guest";
article.CreatedBy = "guest";
article.UpdatedOn = DateTime.Now;
article.CreatedOn = DateTime.Now;
CMSFactory.CMS.ArticleRepository.Save(article);
return RedirectToAction("Index", "Home");
}
表单对象只有一个ID和身体属性。在该方法的顶部,该对象具有前一个(实际上是第一个)发布请求的主体。有没有我不熟悉的缓存? THX
编辑:
我发现,问题的根源是注册我的控制器的方式。在我的Application_Start我有以下代码:
// This only initialized the Castle IOC container
DependencyRegistrat.Init();
DependencyRegistrat.GetDefaultContainer().RegisterAll<IController>(typeof(HomeController).Assembly, ComponentLifecycle.Transient);
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory(DependencyRegistrat.GetDefaultContainer()));
MyControllerFactory如下:
protected override IController GetControllerInstance(Type controllerType)
{
Check.IsNotNull(controllerType, "The given controller type was null, but must be provided");
return (IController) _Container.Resolve(controllerType);
}
public override void ReleaseController(IController controller)
{
var disposable = controller as IDisposable;
if (disposable != null) disposable.Dispose();
_Container.Release(controller);
}
}
返回一个单控制器,而不是每个请求一个新的实例是一个常见的错误写一个控制器出厂的时候。最近发布的MVC 2 Preview 2会检查这种情况,并显示描述解决方案的错误,所以未来的开发人员不应该遇到同样的问题。 – Levi 2009-10-04 01:55:08