2009-05-30 10 views
0

Lorsque vous avez un formulaire ASP.Net MVC créé par Html.BeginForm(), comment les champs à l'intérieur sont-ils remplis? Dans le cas deComment les formulaires sont-ils pré-remplis dans ASP.Net MVC?

<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server"> 
<h2>Edit Dinner</h2> 
<%= Html.ValidationSummary("Please correct the errors and try again.") %> 
<% using (Html.BeginForm()) { %> 
    <p> 
     <label for="Title">Dinner Title:</label> 
     <%= Html.TextBox("Title") %> 
     <%= Html.ValidationMessage("Title", "*") %> 
    </p> 

D'où provient la valeur de Html.TextBox ("Title")? Je sais, le modèle. Et dans ce cas, le modèle a un champ Titre. Mais j'ai des cas où je dois créer un modèle de vue, donc je finis par avoir quelque chose comme:

public class DinnerViewModel { 
    public Dinner Dinner {get; set;}; 
    public SomethingElse SomethingElse {get; set;}; 
} 

et l'utiliser comme modèle, le <% = Html.TextBox (« Titre »)%> obtient la bonne valeur. Ou du moins c'est le cas si la validation échoue et que le formulaire est ré-affiché.

Je demande parce que j'ai un cas d'un formulaire qui est soumis via AJAX (en utilisant Ajax.BeginForm()) et le formulaire est actualisé. Je crée un nouvel objet modèle, vide, mais il charge toujours les valeurs de la dernière soumission. Quand je soumets sans AJAX tout fonctionne bien.

Mise à jour

Je regarde le débogueur dans le modèle. Model.Dinner.Title est égal à "" mais Html.TextArea ("Title", Model.Dinner.Title) place la valeur précédente qui a été soumise dans la zone de texte.

Répondre

2

Les données sont stockées dans ModelState. Les méthodes HtmlHelper rechercheront les valeurs stockées dans l'état du modèle en fonction du nom de l'élément de formulaire. Le ModelState est nettoyé quand je redirige, mais pas quand je reviens juste, comme dans le cas de l'appel AJAX.

0

Vous pouvez également forcer les valeurs à vide:

<% =Html.TextBox("Title", null, new { @value = '' }); %> 

Il serait mieux que de passer d'un modèle vide (valeurs par défaut) à la vue? EDIT C'est ce que vous faites je vois;). Allez-y pour ma première suggestion, vérifiez si la requête est une requête AJAX ou non, puis sur la base de celle-ci passez l'emtpy @value à la TextBox.

+0

Je passe un modèle vide à la vue. – Pablo

0

Je ne suis pas sûr de comprendre le problème. Vous faites une requête ajax mais les champs de texte dans votre formulaire conservent toujours leurs valeurs après l'appel?

Si tel est le cas, vous devez vérifier que ces champs de texte sont à l'intérieur de l'élément associé à la propriété UpdateTargetId de la classe AjaxOption. Lorsque vous effectuez une requête ajax, seule une partie de votre page est mise à jour (celle référencée par la propriété UpdateTargetId). Le reste des champs de votre page ne sera pas mis à jour si vous mettez à jour votre modèle ou non. Regardez cet exemple:

<%= Html.TextBox("Title") %> 
.... 
<div id="myDiv"> 
    <%= Html.TextBox("SomeField") %> 
</div> 

<% using (Ajax.BeginForm(new AjaxOptions() { UpdateTargetId = "myDiv" })) {%> 
    //... blah blah blah 
<% } %> 

Lorsque vous soumettez votre formulaire ajax, seul SomeField champ sera mise à jour, champ Titre restera inchangé.

Lorsque vous soumettez un formulaire normal, la page entière est mise à jour et c'est pourquoi tous les champs sont mis à jour sans ajax.

EDIT: Typo.

Questions connexes