ASP.NET MVC:表单值在第一篇文章后被缓存

时间:2009-10-03 23:50:39

标签: asp.net 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和Body属性。在方法的顶部,此对象具有前一个(实际上是第一个)发布请求的主体。有什么缓存,我不熟悉? 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);
    }
}

3 个答案:

答案 0 :(得分:2)

你确定不是ModelState保持帖子数据缓存吗?因为这就是HtmlHelpers(在这种情况下为Html.TextArea())获取其值的地方。

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

或者,如果您只想清除该字段,而不是整个ModelState,那么: ModelState["Body"].Value = new ValueProviderResult("", "", CultureInfo.CurrentCulture);

答案 1 :(得分:0)

您是在添加新文章还是更新现有文章?

如果要更新现有文章,则应首先从存储库中检索现有文章。

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

答案 2 :(得分:-1)

问题在于控制器注册。我正在使用Castle的IOC容器,出于某种原因,

这(有效):

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

与此不同(不起作用)

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