2010-06-11 3 views
0

j'ai vue où je veux effectuer différentes actions sur les éléments de chaque ligne d'une table, semblable à ce (en, disons, ~/Views/Thing/Manage.aspx):montrant des erreurs d'actions dans les vues basées sur des tables

<table> 
    <% foreach (thing in Model) { %> 
    <tr> 
     <td><%: thing.x %></td> 
     <td> 
     <% using (Html.BeginForm("SetEnabled", "Thing")) { %> 
      <%: Html.Hidden("x", thing.x) %> 
      <%: Html.Hidden("enable", !thing.Enabled) %> 
      <input type="submit" 
       value="<%: thing.Enabled ? "Disable" : "Enable" %>" /> 
     <% } %> 
     </td>  
     <!-- more tds with similar action forms here, a few per table row -->  
    </tr> 
    <% } %> 

Dans mon ThingController, j'ai des fonctions similaires à ce qui suit:

public ActionResult Manage() { 
    return View(ThingService.GetThings()); 
} 

[HttpPost] 
public ActionResult SetEnabled(string x, bool enable) { 
    try { 
    ThingService.SetEnabled(x, enable); 
    } catch (Exception ex) { 
    ModelState.AddModelError("", ex.Message); // I know this is wrong... 
    } 
    return RedirectToAction("Manage"); 
} 

Dans la plupart, cela fonctionne très bien. Le problème est que si ThingService.SetEnabled renvoie une erreur, je veux être en mesure d'afficher l'erreur en haut de la table. J'ai essayé quelques choses avec Html.ValidationSummary() dans la page mais je ne peux pas l'obtenir pour fonctionner.

Notez que je ne veux pas envoyer l'utilisateur à une page séparée pour ce faire, et j'essaye de le faire sans utiliser de javascript.

Suis-je en train d'afficher ma table de la meilleure façon? Comment puis-je afficher les erreurs comme je le souhaite? Je finirai avec peut-être 40 petits formulaires sur la page. Cette approche provient en grande partie de l'article this, mais elle ne gère pas les erreurs de la manière dont j'ai besoin.

Tout preneur?


grâce à Solved @Shaharyar:

public ActionResult Manage() { 
    if (TempData["Error"] != null) 
    ModelState.AddModelError("", TempData["Error"] as string); 
    return View(ThingService.GetThings()); 
} 

[HttpPost] 
public ActionResult SetEnabled(string x, bool enable) { 
    try { 
    ThingService.SetEnabled(x, enable); 
    } catch (Exception ex) { 
    TempData["Error"] = ex.Message; 
    } 
    return RedirectToAction("Manage"); 
} 

Ensuite, il suffit d'une petite forme pour le ValidationSummary au sommet de ma table.

<% using (Html.BeginForm()) { %> 
    <%: Html.ValidationSummary(false) %> 
<% } %> 

Merci!

Répondre

0

Essayons ...

Il y a un TempData dictionnaire disponible pour vous de faire ce genre de choses.

Et vous pourriez avoir à compter sur une autre page pour gérer les erreurs pour vous. Car une exception sera levée dès que le ViewModel ne pourra pas être transmis à la vue.

Mais si le modèle a des problèmes, vous pouvez faire ce qui suit (il suffit de passer un modèle vide à la vue):

public SetEnabled(string x, bool enable) { 
    try { 
    ThingService.SetEnabled(x, enable); 
    return View(viewModel); 
    } catch { 
    TempData["GetThingsError"] = "Oops! Some error happened while processing your request!" 
    return View(); 
    /* 
    * Note that you can also pass the initial model 
    * back to the view -> this will do the model validation 
    * (specified in your model) 
    */ 
    } 
    return RedirectToAction("Manage"); 
} 

Le message TempData est uniquement disponible pour le current request et sera être parti après un rafraîchissement.

Il pourrait être nécessaire de peaufiner encore plus, mais ce serait la direction à suivre pour signaler ce type d'erreur à l'utilisateur/client.

+0

Merci, ça l'a résolu. Idéal que c'est juste disponible pour la demande actuelle. J'ai ajouté le code que j'ai utilisé pour une réponse séparée. – enashnash

+0

Heureux qu'il vous a aidé! Vous pourriez également avoir modifié votre question originale et ajouté une nouvelle section avec la solution. (comportement préféré sur StackOverflow) ;-) –

0

Essayez de faire:

try { 
    ThingService.SetEnabled(x, enable); 
    } catch (Exception ex) { 
    ModelState.AddModelError("", ex.Message); // I know this is wrong... 
    return View(); //return to the view to display the error 
    } 

Si vous retournez le même point de vue qui est dans l'erreur, il rechargements la vue; il y a des éléments de données que vous devrez peut-être recharger, mais en renvoyant la vue par erreur, le framework devrait alors extraire ces erreurs de ModelState et les afficher. Le moyen le plus efficace consiste à utiliser JQuery pour envoyer le formulaire au serveur, afin de ne pas recharger la page et d'afficher un message sur le client.

HTH.

+0

Il n'y a pas de vue SetEnabled, elle est utilisée uniquement pour la publication. Je veux afficher la vue Gérer avec l'erreur après l'envoi à SetEnabled. Aussi, je veux le faire sans javascript. – enashnash

+0

Ok, essayez de retourner View ("Manage"); tant qu'il y a des erreurs dans l'état du modèle, il faut recharger l'état de la vue ... –

Questions connexes