2009-10-03 89 views
1

我可能在这里做了一些完全错误的工作,但由于某种原因,我在其中一个页面中获得的这种表单的值在第一篇文章后得到了缓存。这不是浏览器,因为即使我打开不同的浏览器,发布的值仍然被缓存。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); 
    } 
} 
+1

返回一个单控制器,而不是每个请求一个新的实例是一个常见的错误写一个控制器出厂的时候。最近发布的MVC 2 Preview 2会检查这种情况,并显示描述解决方案的错误,所以未来的开发人员不应该遇到同样的问题。 – Levi 2009-10-04 01:55:08

回答

-1

问题出在控制器注册。我使用城堡的IOC容器中,由于某种原因,

这个(工作):

_Container.AddComponentLifeStyle(typeof(K).FullName.ToLower(), typeof(K), (lifecycle); 

是不同的,这(这不工作)

_Container.AddComponentLifeStyle<I, K>(lifecycle); 
0

你添加新的文章或更新现有的?

如果您正在更新现有文章,您应该首先从存储库检索现有文章。

如果您正在创建新文章,您应该创建一个文章对象。

+0

忘记数据访问代码。它总是一个新的文章。在我甚至开始写入数据库之前,问题出现在这个方法的最顶端。我发现问题的根源,但不是解决方案:(查看编辑了解更多详情 – Yannis 2009-10-04 00:36:32

2

你确定这不是ModelState保持发布数据缓存?因为这就是HtmlHelpers(本例中为Html.TextArea())从中获取它们的值的位置。

尝试在重定向到Save操作前添加ModelState.Clear();

或者,如果你只是想清除场,而不是整个的ModelState,然后: ModelState["Body"].Value = new ValueProviderResult("", "", CultureInfo.CurrentCulture);

+0

经过几个小时,试图找出什么是神奇缓存,你最终回答了解决方案。谢谢! – MisterIsaak 2016-10-25 18:50:55

相关问题