2010-12-06 9 views
23

Ich möchte einige Fragen über ASP.Net MVC. Ich bin nicht vertraut mit Web-Entwicklung, aber ich wurde auf den Web-Teil eines Projekts zugewiesen. Wir tun das folgende: Erstens, wir get & set Eigenschaften für die Person, Daten zu erstellen:RedirectToAction Verwendung in asp.net mvc

public class Person 
{ 
    public int personID {get;set;} 
    public string personName {get;set;} 
    public string nric {get;set;} 
} 

und nach der Anmeldung, wir setzen die Daten in einer Klasse Person Objekt und wir verwenden RedirectToAction wie folgt aus:

return RedirectToAction("profile","person",new { personID = Person.personID}); 

Es funktioniert normal, aber die Parameter werden in der URL angezeigt. Wie kann ich sie verstecken und auch kann ich den Aktionsnamen verstecken? Führe mir bitte den richtigen Weg mit einigen Beispielen.

+3

Bitte aufhören, Ausrufezeichen in Ihren Betreffzeilen zu verwenden !!!! –

+4

Bitte verwenden Sie keine Ausrufezeichen im Allgemeinen, z. B. Kommentare. –

+2

Bitte entfernen Sie den Schlüssel mit dem Ausrufezeichen von Ihrer Tastatur und ermutigen Sie andere, dies zu tun, um diese abscheuliche Fäule aus dem Internet zu entfernen :) – MikeD

Antwort

34

Die Parameter werden in der URL angezeigt, weil das der dritte Parameter zu RedirectToAction ist - die Routenwerte.

Die Standardroute ist {controller}/{action}/{id}

Also dieser Code:

return RedirectToAction("profile","person",new { personID = Person.personID}); 

Wird die folgende URL/Route erzeugen:

/Person/Profil/123

Wenn Sie möchte eine sauberere Route, wie diese (zum Beispiel):

/people/123

Erstellen Sie eine neue Route:

routes.MapRoute("PersonCleanRoute", 
       "people/{id}", 
       new {controller = "Person", action = "Profile"}); 

Und Ihre URL sollte sauber sein, wie die oben genannten.

Alternativ können Sie ID nicht verwenden, Sie können eine andere eindeutige Kennung verwenden - wie einen Spitznamen.

So könnte die URL wie folgt sein:

Personen/rpm1984

, das zu tun, nur Ihre Route ändern:

routes.MapRoute("PersonCleanRoute", 
        "people/{nickname}", 
        new {controller = "Person", action = "Profile"}); 

Und Ihre Aktion-Methode:

public ActionResult Profile(string nickname) 
{ 

} 

Und Ihr RedirectToAction-Code:

return RedirectToAction("profile","person",new { nickname = Person.nickname}); 

Ist es das, wonach Sie suchen?

+0

Also, es gibt keine Möglichkeit, Parameter zu verstecken, wir wollen eigentlich keinen Parameter auf der URL anzeigen. :( – Chong

+0

@Chong - natürlich können Sie Parameter verstecken, es hängt nur von der URL ab. Welche URL wollen Sie * dann? Geben Sie mir eine Beispiel-URL. – RPM1984

+0

Wenn Sie keine Parameter möchten, nur 'redirectToAction zurückgeben ("profile", "person"); "Aber das wird"/person/profile "erzeugen, was als URL eigentlich keinen Sinn ergibt - deshalb bitte ich Sie, mir ein Beispiel für eine gewünschte URL zu geben. – RPM1984

8

Wenn der Parameter nicht in der Adressleiste angezeigt werden soll, müssen Sie ihn irgendwo auf dem Server zwischen den Weiterleitungen beibehalten. Ein guter Platz, um dies zu erreichen, ist TempData.Hier ein Beispiel:

public ActionResult Index() 
{ 
    TempData["nickname"] = Person.nickname; 
    return RedirectToAction("profile", "person"); 
} 

Und jetzt auf dem Profil Aktion umleiten um es zu holen aus TempData:

public ActionResult Profile() 
{ 
    var nickname = TempData["nickname"] as string; 
    if (nickname == null) 
    { 
     // nickname was not found in TempData. 
     // this usually means that the user directly 
     // navigated to /person/profile without passing 
     // through the other action which would store 
     // the nickname in TempData 
     throw new HttpException(404); 
    } 
    return View(); 
} 

Unter den Abdeckungen TempData verwendet Session für die Lagerung, aber es wird automatisch nach der Umleitung vertrieben werden , so könnte der Wert nur einmal verwendet werden, was Sie brauchen: speichern, umleiten, holen.

+0

Richtig, könnte das verwenden. Aber wollten Sie wirklich Serialisierung/De-Serialisierung (Annahme non-in proc-Sitzung) auf einer einzigen Weiterleitung? Wenn er Formulare auth verwendet, kann er trotzdem die Benutzerinformationen vom Ticket holen. – RPM1984

+0

danke für alle Ihre Antworten, meine Frage ist TempData gegangen nach Aktualisierung der Seite und ich habe error.how kann ich damit umgehen? – Chong

+1

@Chong Sitzung verwenden. –

1

kann diese Lösung von Problem sein, wenn TempData nach der Seite gegangen aktualisieren: -

wenn erstes Mal, wenn Sie TempData in Aktion Methode setzen Sie sich in einer Viewdata & Schreibprüfung wie folgt:

public ActionResult Index() 
{ 
    TempData["nickname"] = Person.nickname; 
    return RedirectToAction("profile", "person"); 
} 

jetzt auf der Profilaktion:

public ActionResult Profile() 
{ 
    var nickname = TempData["nickname"] as string; 

if(nickname !=null) 
ViewData["nickname"]=nickname ; 

if (nickname == null && ViewData["nickname"]==null) 
    { 
    throw new HttpException(404); 
    } 
else 
{ 
if(nickname == null) 
nickname=ViewData["nickname"]; 
} 
    return View(); 
} 
Verwandte Themen