Domanda

Ho una visione dove voglio eseguire diverse azioni sulle voci di ciascuna riga in una tabella, in modo simile a questo (a, diciamo, ~/Views/Thing/Manage.aspx):

<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>
  <% } %>

Nel mio ThingController, devo funzioni simili al seguente:

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");
}

Nella maggior parte dei casi, questo va bene lavoro. Il problema è che se ThingService.SetEnabled genera un errore, voglio essere in grado di visualizzare l'errore nella parte superiore della tabella. Ho provato un paio di cose con Html.ValidationSummary() nella pagina, ma non riesco a farlo funzionare.

Si noti che io non voglio inviare l'utente a una pagina separata per fare questo, e sto cercando di farlo senza utilizzare alcun javascript.

Sono andare sulla visualizzazione mio tavolo nel migliore dei modi? Come faccio ad avere gli errori visualizzati nel modo in cui li voglio? Finirò con forse 40 piccole forme sulla pagina. Questo approccio deriva dal questo articolo , ma non gestisce gli errori nel modo in cui ho bisogno.

Eventuali acquirenti?


risolto grazie a @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");
}

Poi basta un piccolo modulo per la ValidationSummary in cima alla mia tavola.

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

Grazie!

È stato utile?

Soluzione

prova di Let ...

C'è un TempData dizionario a disposizione per voi di fare questo genere di cose.

E si potrebbe sono a fare affidamento su un'altra pagina per gestire gli errori per voi.

A causa un'eccezione verrà generata non appena il ViewModel non può essere passato alla vista.

Ma se il modello ha qualche problema, si potrebbe procedere come segue (basta passare un modello vuoto per la vista):

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");
}

Il messaggio TempData è disponibile solo per il richiesta corrente e sarà andato dopo un aggiornamento.

Potrebbe bisogno di qualche ulteriore ritocco, ma che sarebbe la direzione per fare questo tipo di segnalazione degli errori per l'utente / cliente.

Altri suggerimenti

Prova a fare:

 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
  }

Se si restituisce la stessa vista che è in errore, ricarica la vista; ci sono alcuni elementi di dati che potrebbe essere necessario per ricaricare, ma tornando la vista per errore quadro dovrebbero quindi estrarre quegli errori da ModelState e li visualizza.

Il modo più efficace è quello di utilizzare JQuery per inviare il modulo al server, quindi non si è sempre ricaricare la pagina e visualizzare un messaggio sul client.

HTH.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top