2010-12-06 9 views
23

Je veux poser des questions sur ASP.Net MVC. Je ne suis pas familier avec le développement web, mais j'ai été affecté à la partie web d'un projet. Nous faisons ce qui suit: tout d'abord, nous créons get & set propriétés pour les données personne:Utilisation de RedirectToAction dans asp.net mvc

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

et après la connexion, nous avons mis les données dans un objet et nous utilisons la classe PersonRedirectToAction comme ceci:

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

Cela fonctionne normalement, mais les paramètres sont affichés dans l'URL. Comment puis-je les cacher et puis-je cacher le nom de l'action? Guide-moi dans le bon sens avec quelques exemples, s'il te plaît.

+3

Veuillez arrêter d'utiliser des points d'exclamation dans vos lignes d'objet !!!! –

+4

Veuillez ne pas utiliser les points d'exclamation en général, tels que les commentaires. –

+2

Veuillez retirer la clé contenant le point d'exclamation de votre clavier et encourager les autres à le faire pour supprimer ainsi cette brûlure hideuse de l'Internet :) – MikeD

Répondre

34

Les paramètres sont affichés dans l'URL car c'est ce que le troisième paramètre à RedirectToAction est - les valeurs de route.

La route par défaut est {controller}/{action}/{id}

donc ce code:

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

produira l'URL/itinéraire suivant:

/personne/Profil/123

Si vous voulez un itinéraire plus propre, comme ceci (par exemple):

/personnes/123

Créer une nouvelle route:

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

Et votre URL doit être propre, comme celle-ci. Sinon, vous n'aimez peut-être pas du tout utiliser l'ID, vous pouvez utiliser un autre identifiant unique - comme un surnom.

Ainsi, l'URL pourrait ressembler à ceci:

personnes/rpm1984

Pour ce faire, il suffit de changer votre itinéraire:

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

Et votre méthode d'action:

public ActionResult Profile(string nickname) 
{ 

} 

Et votre code RedirectToAction:

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

Est-ce que c'est votre après?

+0

donc, il n'y a aucun moyen de cacher les paramètres? En fait, nous ne voulons pas montrer de paramètre à l'URL. :( – Chong

+0

@Chong - bien sûr, vous pouvez masquer les paramètres, cela dépend de l'URL. * Quelle URL souhaitez-vous * puis? Donnez-moi un exemple d'URL – RPM1984

+0

si vous ne voulez pas de paramètres, faites juste 'return RedirectToAction ("profile", "person"); 'Mais cela produira'/person/profile' qui n'a pas vraiment de sens en tant qu'URL - c'est pourquoi je vous demande de me donner un exemple d'URL que vous voulez. – RPM1984

8

Si vous ne souhaitez pas que le paramètre soit affiché dans la barre d'adresse, vous devez le conserver quelque part sur le serveur entre les redirections. Un bon endroit pour y parvenir est TempData.Voici un exemple:

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

Et maintenant l'action du profil vous redirigez la chercher de 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(); 
} 

Sous les couvertures TempData utilise Session pour le stockage, mais il sera évincé automatiquement après la redirection , donc la valeur pourrait être utilisée seulement une fois ce qui est ce dont vous avez besoin: stocker, rediriger, chercher.

+0

True, pourrait l'utiliser. Mais voulez-vous vraiment sérialiser/désérialiser (en supposant une session non-In proc) sur une seule redirection? S'il utilise des formulaires auth, il peut quand même récupérer les informations sur l'utilisateur à partir du ticket. – RPM1984

+0

merci pour toutes vos réponses, ma question est TempData allé après rafraîchir la page et j'ai eu error.how puis-je gérer cela? – Chong

+1

@Chong use Session. –

1

cela peut être une solution de problème lorsque TempData allé se rafraîchir après la page: -

lors de la première fois que vous obtenez TempData dans la méthode d'action il mis dans un contrôle d'écriture ViewData & comme ci-dessous:

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

maintenant sur l'action Profil:

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(); 
} 
Questions connexes