Question

J'ai un problème qui se pose sous une forme que j'essaie de poster. Dans le cas où le formulaire ne serait pas validé, je choisirais ModelState.AddModelError () , puis je renverrais un résultat d'affichage.

Le problème, c’est que les assistants HTML. * sont supposés prendre la valeur publiée lors du rendu et je remarque que mes champs de texte le font UNIQUEMENT si je les inclut dans la liste de paramètres de l’action de publication, ce qui ne devrait pas Ne soyez pas obligé de voir que certains formulaires ont trop de champs pour vouloir tous les lister en tant que paramètres.

Mon code d'action est approximativement:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name)
{
    var dataDefinition = ...

    // do some validation stuff
    if (!ModelState.IsValid)
    {
        // manually set checkbox fields via ViewData seeing as this STILL doesn't work in MC 1.0 :P
        // ...
        return View(dataDefinition);
    }

}

Désormais, dataDefinition (qui est une entité LINQ to SQL) a un champ MinVolume , géré dans la vue par cette ligne:

Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%>

Pourtant, lorsque la vue est rendue après une validation ModelState ayant échouée, la valeur saisie dans la page d'origine que nous avons publiée n'est pas conservée, SAUF SI je l'inclue en tant que paramètre dans la méthode de publication. Littéralement, je peux " résoudre le problème " en faisant ceci:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name, string minVolume)

Pour une raison quelconque, la valeur du champ sera conservée. Cela me semble stupide parce que ma forme a beaucoup plus de valeurs que cela et que je ne devrais pas avoir à ajouter de paramètre pour ce champ.

Des idées?

Était-ce utile?

La solution

Se pourrait-il que votre code:

<%= Html.TextBox("MinVolume", null, new { size = 5 })%>

.. le null a-t-il la valeur par défaut param? Peut-être que si vous changez le null en Model.MinVolume , la valeur sera conservée. Comme ceci:

<%= Html.TextBox("MinVolume", Model.MinVolume, new { size = 5 })%>

Je ne suis pas sûr que votre action retourne la valeur MinVolume dans le modèle. Si c'est le cas, ce qui précède devrait fonctionner. Sinon, vous devrez peut-être reformuler légèrement l'action.

Autres conseils

Oh mec, je viens d’améliorer la conception de mes applications. Le problème se produit parce que vous avez une validation personnalisée (moi aussi). Vous devez ajouter après

ModelState.AddModelError()

ceci

ModelState.SetModelValue("MinVolume", ValueProvider["MinVolume"]);

En vue, il doit être

Mimum:<%=Html.Textbox("MinVolume")%>

Vous ne savez toujours pas pourquoi cela fonctionne mais cela a fonctionné pour moi.

Quelle est la clé que vous utilisez lorsque vous définissez la valeur dans ModelState en cas d'erreur? Le code qui définit le paramètre value pour une zone de texte ressemble à ceci:

Partie pertinente du code de cadre téléchargé .

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);

Comme vous pouvez voir si la valeur de tentative existe, il l'utilisera, mais uniquement si la même clé est disponible.

Je sais que cela fonctionne car j'ai une action qui ne prend aucun paramètre, obtient les valeurs directement du ValueProvider et utilise AddModelError pour indiquer les erreurs de validation. Je suis sûr que les valeurs de ma zone de texte sont conservées.

MODIFIER : pour que les valeurs soient conservées, elles doivent être associées au modèle. Pour ce faire, vous pouvez les ajouter à la liste des paramètres. Une autre méthode consiste à utiliser UpdateModel (avec les noms de paramètre dans la liste blanche ou sans liste blanche). Une troisième façon consiste à ajouter explicitement le paramètre au modèle, comme dans la réponse de @ Jenea. Comme l'assistant tire uniquement de l'état du modèle, il doit être présent pour que les valeurs soient conservées. Il ne regarde pas la propriété Form de la requête.

Si je comprends bien, la solution est la suivante:

[Transaction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(int id, FormCollection form)
{
    T itemToUpdate = repository.Get(id);
    UpdateModel(itemToUpdate, form.ToValueProvider());

    if (itemToUpdate.IsValid())
    {
        repository.SaveOrUpdate(itemToUpdate);
        return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
    }

    repository.DbContext.RollbackTransaction();
    return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
}

bonne chance!

Une autre solution consiste à saisir dans la vue:

<%var minVolume=Request["MinVolume"]??"";%>
<%=Html.Textbox("MinVolume",minVolume,new {size=5})%>

Veuillez vous référer à cet article pour voir différentes manières de gérer la publication dans ASP.NET MVC

texte du lien

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top