2010-12-09 7 views
4

Lorsque vous utilisez un formulaire comme celui-ci:ASP.NET MVC - Mettre en forme le signet HTML?

<h2> 
<%:Model.EulaTitle %> 
</h2> 
<p> 
<%=Model.EulaHtml %> 
</p> 
<a name="errors"></a> 
<%:Html.ValidationSummary()%> 


<div style="text-align:center;"> 
<% using (Html.BeginForm()) 
    { %> 

<%:Html.HiddenFor(model => model.SourceUrl)%> 
<%:Html.HiddenFor(model => model.EulaId)%> 


<a name="accept"></a> 
<div style="text-align:center;"> 
<%:Html.CheckBoxFor(model => model.Accepted)%> 
<%:Html.LabelFor(model => model.Accepted)%> 
</div> 
<input type="submit" value="Submit"> 
<% } %> 
</div> 

J'ai besoin la page pour faire défiler #errors quand il messages. Le Model.EulaHtml contient du texte CLUF de longueur et je préférerais que l'utilisateur n'ait pas à faire défiler manuellement pour voir un message d'erreur s'il publie la page sans accepter le contrat.

Si le contrôleur détecte ModelState.IsValid dans Post, il redirige vers une autre page. Si ce n'est pas le cas, je dois rester sur cette page, mais faites défiler jusqu'à la balise d'ancrage de signet #errors.

J'ai pensé à simplement ajouter '#errors' à la fin de l'URL dans l'action de formulaire, mais je reçois des erreurs le long de la ligne a potentially dangerous .... ('%'). Il est possible que je code incorrectement la marque de hachage. Quelqu'un d'autre a dû faire face à cela? Nous traitons des exigences assez restrictives pour la compatibilité du navigateur (IE6 + et tout le reste sous le soleil), donc j'essaie d'éviter d'utiliser JavaScript autant que possible.

Mise à jour

L'erreur que je reçois est:

A potentially dangerous Request.Path value was detected from the client (%). 

Je modifed l'appel Html.BeginForm() à

<% using (Html.BeginForm(new { @action="#errors" })) 
    { %> 

Et l'URL résultante est:

http://..../TheControllerName/Eula/%2523errors/ 

J'ai également remarqué que quelques paramètres queryString qui passaient par disparaissent lorsque je définis l'attribut action de cette manière. (Pas étonnant, mais pas de solution pour cela est immédiatement évident pour moi)

+0

Quelle est l'erreur exacte que vous obtenez? La bonne façon de le faire est d'ajouter les #erreurs à la fin de l'URL. Après avoir redirigé vers l'URL avec les #erreurs à la fin, voyez-vous la bonne adresse dans la barre d'adresse du navigateur? – willvv

+0

Mise à jour de la question avec l'erreur et l'URL générée –

Répondre

6

Essayez comme ceci:

<form action="<%: Url.Action("actionName", "controllerName") %>#errors" method="post"> 

    <%:Html.HiddenFor(model => model.SourceUrl)%> 
    <%:Html.HiddenFor(model => model.EulaId)%> 


    <a name="accept"></a> 
    <div style="text-align:center;"> 
    <%:Html.CheckBoxFor(model => model.Accepted)%> 
    <%:Html.LabelFor(model => model.Accepted)%> 
    </div> 
    <input type="submit" value="Submit"> 

</form> 

Vous pouvez aussi écrire un assistant HTML personnalisé qui fera le travail:

public static class FormExtensions 
{ 
    public static MvcForm MyBeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName, string fragment) 
    { 
     var formAction = UrlHelper.GenerateUrl(null, actionName, controllerName, htmlHelper.ViewContext.HttpContext.Request.Url.Scheme, null, fragment, null, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true); 
     var builder = new TagBuilder("form"); 
     builder.MergeAttribute("action", formAction); 
     builder.MergeAttribute("method", "post", true); 
     htmlHelper.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag)); 
     return new MvcForm(htmlHelper.ViewContext); 
    } 
} 

Et puis:

<% using (Html.MyBeginForm("index", "home", "errors")) { %> 
    ... 
<% } 
+0

C'est amusant: Maintenant, la seule chose que je vois dans le contenu div dans la page après avoir posté dans # erreurs est le résumé de la validation et le contenu du formulaire. Le code HTML pour le reste du contenu de la page est toujours là, mais il ne s'affiche pas. Grr. Argh. –

+0

Eh bien, vous avez résolu le problème de signet, mais j'ai découvert que chaque fois que je lier un signet, la plupart du contenu disparaît de la page. Je vais accepter cela et ouvrir une autre question pour cela. –

5

Mise à jour solution MVC 4 au problème:

@using (Html.BeginForm(null, null, null, FormMethod.Post, 
    new 
     { 
      @action = Url.Action("MyAction") + "#bookmark", 
      @class = "form-class", 
      target = "_blank" 
     })) 
{ 
    ... 
    <input type="submit" value="submit" /> 

} 

Html.BeginForm va générer la validation des attributs dans votre formulaire, en utilisant la balise html <form> ne sera pas.

Cet appel utilise la surcharge Html.BeginForm(actionName, controllerName, routeValues, FormMethod, htmlAttributes), annulant tout le routage et affectant l'action en tant qu'attribut html à la place. Le routage est accompli en utilisant Url.Action(), auquel j'ajoute mon signet.