2010-09-23 23 views
1

J'ai une vue partielle où je rends, si l'utilisateur a choisi une option, un bouton qui permet à l'utilisateur de générer automatiquement une valeur pour un certain champ. S'il vous plaît donner un coup d'oeil à cette image pour comprendre ce que je veux dire:Pourquoi mon bouton n'apparaît-il pas?

alt text

Ceci est réalisé en utilisant le balisage suivant sur la vue partielle

<%= Html.LabelFor(model => model.IssueCode)%> 
<br /> 
<% if (Model.HasCodeGenerator) { %> 
    <%= Html.TextBoxFor(model => model.IssueCode, new { style = "width:120px;background-color:#eeeeee;border: solid 2px #dfdfdf", @readonly = "readonly" })%> 
    <% if (Model.ModelState == ModelStateEnum.Add) { %> 
     <button id="codeGenerator" style="font-size: 0.7em;margin-right: 10px">Genera codice fascicolo</button> 
    <% } %> 
<% } else { %> 
    <%= Html.TextBoxFor(model => model.IssueCode, new { style="width: 120px" })%> 
<% } %> 
<%= Html.ValidationMessageFor(model => model.IssueCode, "*")%> 

Comme vous pouvez le voir, je joins toujours Html. ValidationMessageFor() à la fin du champ de saisie et ValidationSummary à la fin de la vue.

Lorsque l'utilisateur soumet le formulaire le premier bloc de code exécuté par l'action est la

suivante
if (!ModelState.IsValid) { 
    //Invalid - redisplay form with errors 
    return PartialView("IssueCodeGenerator", model); 
} 

et c'est le résultat que je reçois dans tous les trois cas

alt text

Pourquoi le code de balisage du bouton disparaît?

Merci de votre aide!

1er EDIT:

Après validation de la zone de texte IssueCode lâche, il est attribut readonly = "lecture seule". Cela signifie que la première condition est pas bien, je pense ....

2ème EDIT:

Selon le commentaire Darin J'inclus

  1. L'action qui montre la vue partielle
  2. un extrait de la partie qui montrent que la variable ModelState est maintenue en tant que témoin caché à l'intérieur de la forme
  3. le dispositif de commande d'action appelée par le partiel
  4. Le code jQuery qui soumet la partie

1 - C'est l'action qui montre la partie

[HttpGet] 
public ActionResult Create() 
{ 
    IssueModel im = new IssueModel() 
    { 
     ModelState = ModelStateEnum.Add, 
     FirmID = _firmManager.GetMyFirmID(), 
     CreatedDate = DateTime.Now, 
     LastUpdateDate = DateTime.Now, 
     HasCodeGenerator = _optionManager.HasIssueCodeGenerator() 
    }; 
    return PartialView("Issue", im); 
} 

2 - Extrait du Issue.ascx

<% using (Html.BeginForm("SaveOrDelete", "Issue", FormMethod.Post, new { id = "crudForm" })) { %> 
    <%= Html.HiddenFor(model => model.FirmID) %> 
    <%= Html.HiddenFor(model => model.IssueID) %> 
    <%= Html.HiddenFor(model => model.ModelState) %> 

partielle 3 - C'est l'action du contrôleur appelée lorsque le formulaire est soumis.

[HttpPost] 
public ActionResult SaveOrDelete(IssueModel model) { 
    if (!ModelState.IsValid) { 
     //Invalid - redisplay form with errors 
     return PartialView("Issue", model); 
    } 

    try { 
     Issue i = null; 
     if (model.ModelState == ModelStateEnum.Add) 
      i = new Issue(); 
     else 
      i = _manager.FindIssueByIssueID(model.IssueID); 
     if (model.ModelState != ModelStateEnum.Delete) { 
      _manager.BindIssueModel(i, model); 
      if (model.ModelState == ModelStateEnum.Add) 
       i.FirmID = _contactManager.GetMyContact().FirmID; 
      i.LastUpdateDate = DateTime.Now; 
      _manager.SaveIssue(i); 
     } else { 
      _manager.DeleteIssue(i); 
     } 
     return PartialView("ActionCompleted"); 
    } 
    catch (Exception ex) { 
     return PartialView("ActionError", 
      new ActionErrorModel() { Message = ex.Message }); 
    } 
} 

4 - Ce code jQuery qui soumettre le formulaire

$("#crudForm").submit(function(event) { 
    event.preventDefault(); 
    $("#crudForm").block(); 
    $.ajax({ 
     type: "post", 
     dataType: "html", 
     url: "/Issue/SaveOrDelete", 
     sync: true, 
     data: $("#crudForm").serialize(), 
     success: function(response) { 
      $("#crudForm").parent().html('').html(response); 
      $("#crudForm").unblock(); 
     }, 
     error: function(response) { 
      $("#crudForm").unblock(); 
     } 
    }); 
}); 

espoir que cela aiderait à trouver le problème. Je vous remercie.

Répondre

0

Parce que Model.ModelState == ModelStateEnum.Add est faux?

MVC ne se coupera pas votre bouton html ...


Même sans voir la forme de son assez clair que Darin est juste et votre ModelState ENUM se prépare à null.

+0

@jfar: Non. Ce n'est pas vrai. ModelState est égal à true avant de soumettre le formulaire. Je viens de renvoyer le même modèle que j'ai reçu. Je sais que MVC ne désactivera pas mon bouton mais je suspecte que quelque chose se passe quand la validation se produit ... – Lorenzo

+0

@jfar: pour être plus précis ... si je force que la validation ne retournera pas faux remplir tous les champs que j'ai vérifié que mon code de couche de données exécute la branche "Insert". Cela signifie que Model.ModelState évalue à ModelStateEnum.Add .. – Lorenzo

+1

@Lorenzo, au lieu d'expliquer tout cela, veuillez montrer votre code de contrôleur car il est plus qu'évident que le problème ici est lié au fait que les propriétés de votre modèle ne sont pas correctement remplies et vous n'entrerez pas dans la bonne branche 'if'. Ne pensez pas que si vous renvoyez le même modèle à la vue que celui que vous avez reçu en tant que paramètre de votre action de contrôleur, ce modèle est OK. Si vous n'avez pas de champ correspondant dans votre vue pour définir par exemple la propriété ModelState, il prendra simplement une valeur par défaut. –

Questions connexes