Πώς να RedirectToAction στο ASP.NET MVC χωρίς απώλεια δεδομένων αίτηση

ψήφοι
115

Χρησιμοποιώντας ASP.NET MVC υπάρχουν καταστάσεις (όπως η υποβολή μορφή) που μπορεί να απαιτήσει RedirectToAction.

Μια τέτοια κατάσταση είναι όταν αντιμετωπίζετε σφάλματα επικύρωσης μετά την υποβολή μορφή και πρέπει να ανακατευθύνει πίσω στη μορφή, αλλά θα ήθελα τη διεύθυνση URL για να αντανακλούν τη διεύθυνση URL της μορφής, δεν είναι η σελίδα δράσης υποβάλλει στο.

Όπως απαιτούν τη φόρμα για να περιέχει τα αρχικά POSTed δεδομένων, για την διευκόλυνση του χρήστη, καθώς και σκοπούς επαλήθευσης, πώς μπορώ να μεταφέρω τα δεδομένα μέσω του RedirectToAction(); Αν μπορώ να χρησιμοποιήσω την παράμετρο Viewdata, μου POSTπαράμετροι θα πρέπει να αλλάξει σε GETπαραμέτρων.

Δημοσιεύθηκε 05/08/2008 στις 06:33
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
76

Η λύση είναι να χρησιμοποιήσετε την ιδιότητα TempData για να αποθηκεύσει τα επιθυμητά συστατικά Αίτηση.

Για παράδειγμα:

public ActionResult Send()
{
    TempData["form"] = Request.Form;
    return this.RedirectToAction(a => a.Form());
}

Στη συνέχεια, στη δράση σας «Μορφή» μπορείτε να πάτε:

public ActionResult Form()
{
    /* Declare viewData etc. */

    if (TempData["form"] != null)
    {
        /* Cast TempData["form"] to 
        System.Collections.Specialized.NameValueCollection 
        and use it */
    }

    return View("Form", viewData);
}
Απαντήθηκε 05/08/2008 στις 06:43
πηγή χρήστη

ψήφοι
36

Λάβετε υπόψη ότι TempData αποθηκεύει τη συλλογή μορφή στη σύνοδο. Αν δεν σας αρέσει αυτή η συμπεριφορά, μπορείτε να εφαρμόσετε τη νέα διεπαφή ITempDataProvider και χρησιμοποιήστε κάποιο άλλο μηχανισμό για την αποθήκευση δεδομένων temp. Δεν θα το κάνουμε αυτό αν δεν ξέρετε για ένα γεγονός (μέσω της μέτρησης και προφίλ) ότι η χρήση των κρατικών συνόδου είναι να σας πληγώνει.

Απαντήθηκε 07/08/2008 στις 06:12
πηγή χρήστη

ψήφοι
13

Ρίξτε μια ματιά σε MVCContrib , μπορείτε να το κάνετε αυτό:

using MvcContrib.Filters;

[ModelStateToTempData]
public class MyController : Controller {
    //
    ...
}
Απαντήθηκε 05/04/2009 στις 10:36
πηγή χρήστη

ψήφοι
8

Υπάρχει ένας άλλος τρόπος που αποφεύγει tempdata. Το μοτίβο Μου αρέσει περιλαμβάνει τη δημιουργία 1 δράσης τόσο για την αρχική καθιστούν και την εκ νέου καθιστούν της άκυρης μορφής. Θα πάει κάπως έτσι:

var form = new FooForm();

if (request.UrlReferrer == request.Url)
{
     // Fill form with previous request's data
}

if (Request.IsPost())
{
     if (!form.IsValid)
     {
         ViewData["ValidationErrors"] = ...
     } else {
         // update model
         model.something = foo.something;
         // handoff to post update action
         return RedirectToAction("ModelUpdated", ... etc);
     }
}

// By default render 1 view until form is a valid post
ViewData["Form"] = form;
return View();

Αυτό είναι το μοτίβο περισσότερο ή λιγότερο. Λίγο pseudoy. Με αυτό μπορείτε να δημιουργήσετε 1, προκειμένου να χειριστεί καθιστώντας τους μορφή, την εκ νέου εμφάνιση των τιμών (από το έντυπο θα πρέπει να συμπληρωθεί με τις προηγούμενες τιμές), και δείχνει μηνύματα λάθους.

Όταν η απόσπαση σε αυτήν την ενέργεια, αν ισχύει του μεταφέρει τον έλεγχο σε μια άλλη δράση.

Προσπαθώ να κάνω αυτό το μοτίβο εύκολη στο πλαίσιο επικύρωσης .net , όπως χτίζουμε την υποστήριξη για MVC.

Απαντήθηκε 25/08/2008 στις 23:06
πηγή χρήστη

ψήφοι
2

Αν θέλετε να περάσετε τα δεδομένα στην ανακατεύθυνση δράση, η μέθοδος που θα μπορούσε να χρησιμοποιήσει είναι:

return RedirectToAction("ModelUpdated", new {id = 1});
// The definition of the action method like  public ActionResult ModelUpdated(int id);
Απαντήθηκε 30/11/2013 στις 09:39
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more