2009-10-03 4 views
1

Je fais peut-être quelque chose de complètement faux ici mais pour une raison quelconque les valeurs de cette forme que j'ai dans une de mes pages sont mises en cache après le premier post. Ce n'est pas un navigateur car même si j'ouvre un navigateur différent, les valeurs affichées sont toujours mises en cache.ASP.NET MVC: les valeurs de formulaire sont mises en cache après le premier message

Ma forme est très simple:

<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> 

Mon action du contrôleur est encore plus simple:

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

L'objet de formulaire ne dispose que d'une pièce d'identité et une propriété du corps. Tout en haut de la méthode, cet objet a le corps de la requête précédente (en fait la première). Y at-il une mise en cache que je ne connais pas? thx

EDIT:

Je trouve que l'origine du problème est la façon dont j'enregistrer mes contrôleurs. Dans mon Application_Start je le code suivant:

 // 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 est comme suit:

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

De retour un contrôleur singleton au lieu d'une nouvelle instance par requête est une erreur courante lors de l'écriture d'une usine de contrôleur. Le MVC 2 Preview 2 récemment publié vérifie cette condition et affiche une erreur décrivant la solution, de sorte que les futurs développeurs ne devraient pas rencontrer ce même problème. Oubliez le code d'accès aux données – Levi

Répondre

-1

Le problème résidait dans l'enregistrement du contrôleur. J'utilise le conteneur du CIO Castle et pour une raison quelconque,

ce (qui fonctionne):

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

est différent que ce (qui ne marche pas travail)

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

Êtes-vous ajouter un nouvel article ou mettre à jour un existant?

Si vous mettez à jour un article existant, vous devez d'abord récupérer l'article existant dans le référentiel.

Si vous créez un nouvel article, vous devriez ajouter un objet Article.

+0

C'est toujours un nouvel article. le problème est au sommet de cette méthode avant même que je commence à écrire à la DB. J'ai trouvé l'origine du problème, mais pas la solution :(Vérifiez l'Edit pour plus de détails – Yannis

2

Etes-vous sûr ce n'est pas ModelState en conservant les données de la mise en cache? Parce que c'est là que les HtmlHelpers (Html.TextArea() dans ce cas) obtiennent leurs valeurs. Essayez d'ajouter ModelState.Clear(); avant de rediriger l'action Save.

Ou si vous voulez juste pour effacer ce champ, plutôt que l'ensemble ModelState, puis: ModelState["Body"].Value = new ValueProviderResult("", "", CultureInfo.CurrentCulture);

+0

Après des heures d'essayer de comprendre ce qui était magiquement la mise en cache, vous avez finalement donné la solution. – MisterIsaak

Questions connexes