2010-07-22 4 views
0

J'ai un problème étrange avec une vue d'édition qui rend la zone de texte désactivée pour slug, ce qui permet à l'utilisateur de voir le slug du contenu qu'il est en train de modifier mais ne peut pas le modifier. Le slug ne peut être modifié que dans la vue Create où la zone de texte est activée. En mode d'édition, seul le titre peut être modifié.La zone de texte désactivée est affichée dans une vue mais pas dans une autre

En mode édition, la zone de texte Slug est remplie à partir du ViewModel transmis et cela fonctionne. Cependant, lors de la publication des modifications, le slug n'est pas publié dans la vue Edit pour un type de contenu (ce qui est, je crois, le bon comportement) et en tant que tel Model.IsValid (parce que j'ai l'attribut Required attaché à la propriété Slug) échoue. C'est, comme dit, le plus probable le comportement correct. La chose est dans la vue Éditer pour un autre type de contenu que le contenu de la zone de texte désactivée est affiché et le modèle de vue affiché est valide et je peux même voir la valeur pour le Slug inchangé.

Je pourrais code postal mais ce sont des vues assez énormes, mais la section pertinente de code qui rend les zones de texte Titre et Slug est le même pour les deux Création/vue Edition et sur les deux types de contenu et il est ceci:

<div class="editor-label"> 
    <%= Html.LabelFor(model => model.Title, Resources.Localize.Section_Title)%> 
</div> 
<div class="editor-field"> 
    <%= Html.TextBoxFor(model => model.Title) %> 
    <%= Html.ValidationMessageFor(model => model.Title) %> 
</div> 
<div class="editor-label"> 
    <%= Html.LabelFor(model => model.Slug, Resources.Localize.Section_Slug)%> 
</div> 
<div class="editor-field"> 
    <% if (string.IsNullOrWhiteSpace(Model.Slug)) 
{ %> 
    <%= Html.TextBoxFor(model => model.Slug)%> 
    <% } 
else 
{ %> 
    <%= Html.TextBoxFor(model => model.Slug, new { disabled = true })%> 
    <% } %> 
    <%= Html.ValidationMessageFor(model => model.Slug) %> 
</div> 

J'utilise une vue partielle à la fois Créer et modifier, voilà pourquoi il y a que if ... else ... déclaration parce que nous désactivons que la zone de texte Slug lors de l'édition.

J'espère que quelqu'un a une idée à ce sujet parce que je ne peux pas le comprendre.

MISE À JOUR:

La chose wierdest. Ces lignes

<form id="Page-CreateEditForm" action="<%=Url.Action(Url.RequestContext.RouteData.GetRequiredString("action"), Url.RequestContext.RouteData.GetRequiredString("controller")) %>" enctype="multipart/form-data" method="post"> 

<form id="Section-CreateEditForm" action="<%=Url.Action(Url.RequestContext.RouteData.GetRequiredString("action"), Url.RequestContext.RouteData.GetRequiredString("controller")) %>" enctype="multipart/form-data" method="post"> 

dans mes vues (même dans les deux) génèrent ces:

Formulaire balise de début lorsque la page d'édition "page de test". Slug: page de test. Notez la limace dans l'action!

<form id="Page-CreateEditForm" action="/Page/Edit/test-page" enctype="multipart/form-data" method="post"> 

Etiquette de début de formulaire lors de l'édition de la section "Section de test". Slug: section de test. Notez comment le slug est manquant après Edit. Maintenant, la question se pose: pourquoi la même définition de balise de formulaire aboutirait-elle à deux actions différentes au moment de l'exécution?

SUIVI:

Bien sûr, après mûre réflexion rapide cela doit provenir de la définition des itinéraires en Global.asax.cs, donc nous allons le vérifier là-bas. C'est ce que nous trouvons:

 routes.MapRoute(Localize.Routes_PagesEdit, RouteType.Admin, "Page/Edit/{slug}", 
         new {controller = "Page", action = "Edit", slug = ""}, null); 

     routes.MapRoute(
      Localize.Routes_SectionsEdit, 
      RouteType.Regular, 
      "Section/Edit", 
      new {controller = "Section", action = "Edit"}, null 
      ); 

Voyez comment la route Edit Section paramètre manquant {slug}. Je crois que je me rapproche de la solution.

+0

Avez-vous réellement regardé le HTML généré dans le navigateur (voir la source) et confirmé que le slug est désactivé dans les deux vues? –

+0

Ouais, c'est la chose, les deux sont render avec disabled = "true" et les deux ont une valeur définie sur le Slug existant (lors de l'édition) et les deux zones de texte sont grisées. Et pourtant, l'un d'entre eux est posté, pas un autre. – mare

+2

En effet, c'est le problème de routage (paramètre de slug manquant). Apparemment, le classeur de modèle par défaut est capable de lier les paramètres de chaîne de requête d'URL au ViewModel sur POST, donc même si la zone de texte pour Slug est désactivée, il peut obtenir la valeur de la chaîne de requête. – mare

Répondre

0

En effet, c'est le problème de routage (paramètre de slug manquant). Apparemment, le classeur de modèle par défaut est capable de lier les paramètres de chaîne de requête d'URL au ViewModel sur POST, donc même si la zone de texte pour Slug est désactivée, il peut obtenir la valeur de la chaîne de requête.

Changé ce

routes.MapRoute( 
    Localize.Routes_SectionsEdit, 
    RouteType.Regular, 
    "Section/Edit", 
    new {controller = "Section", action = "Edit"}, null 
    ); 

à cette

routes.MapRoute( 
      Localize.Routes_SectionsEdit, 
      RouteType.Regular, 
      "Section/Edit/{slug}", 
      new {controller = "Section", action = "Edit"}, null 
      ); 

et résolu la question.

Questions connexes