ASP.NET MVC: значения форм кэшируются после первого сообщения - PullRequest
1 голос
/ 04 октября 2009

Я мог бы сделать что-то совершенно не так, но по какой-то причине значения этой формы, которые я имею на одной из моих страниц, кэшируются после первого поста. Это не браузерная вещь, потому что даже если я открою другой браузер, отправленные значения все еще будут кэшированы.

Моя форма очень проста:

<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");
    }

Объект формы имеет только идентификатор и свойство Body. Прямо в верхней части метода этот объект имеет тело предыдущего (фактически первого) пост-запроса. происходит ли кеширование, с которым я не знаком? ТНХ

EDIT:

Я обнаружил, что источником проблемы является способ регистрации контроллеров. В моем 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 ]

2 голосов
/ 16 октября 2009

Вы уверены, что не ModelState хранит данные в кэше? Потому что именно здесь HtmlHelpers (Html.TextArea() в данном случае) получают свои значения.

Попробуйте добавить ModelState.Clear(); перед перенаправлением в вашем Save действии.

Или, если вы просто хотите очистить это поле, а не весь ModelState, тогда: ModelState["Body"].Value = new ValueProviderResult("", "", CultureInfo.CurrentCulture);

0 голосов
/ 04 октября 2009

Проблема была в регистрации контроллера. Я использую контейнер IOC Касла и по какой-то причине

это (что работает):

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

отличается от этого (который не работает)

_Container.AddComponentLifeStyle<I, K>(lifecycle);
0 голосов
/ 04 октября 2009

Вы добавляете новую статью или обновляете существующую?

Если вы обновляете существующую статью, вам следует сначала извлечь существующую статью из хранилища.

Если вы создаете новую статью, вы должны обновлять объект Article.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...