2010-12-06 2 views
23

Я хочу опубликовать некоторые вопросы о ASP.Net MVC. Я не знаком с веб-разработкой, но я был назначен на веб-часть проекта. Мы делаем следующее: во-первых, мы создаем get & set свойства для данных человека:Использование RedirectToAction в asp.net mvc

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

и после входа в систему, мы помещаем данные в объекте класса Person и мы используем RedirectToAction так:

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

Работает нормально, но параметр указан в URL-адресе. Как я могу скрыть их, а также можно ли скрыть имя действия? Пожалуйста, объясните мне правильный путь.

+3

Пожалуйста, прекратите использовать восклицательные знаки в своих сюжетных линиях !!!! – 2010-12-22 03:21:01

+4

Пожалуйста, прекратите использовать восклицательные знаки в целом, например комментарии. – 2013-04-03 18:18:05

+2

Пожалуйста, удалите ключ, содержащий восклицательный знак, со своей клавиатуры и побудите других сделать это, чтобы удалить этот ужасный урон из Интернета :) – MikeD 2014-01-14 13:30:48

ответ

34

Параметр отображается в URL-адресе, потому что это третий параметр, равный RedirectToAction, - значения маршрута.

маршрут по умолчанию {controller}/{action}/{id}

Так этот код:

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

будет производить следующий URL/маршрута:

/Person/Профиль/123

Если вы хотите более чистый маршрут, например, это (например):

/люди/123

Создать новый маршрут:

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

И ваш URL должен быть чистым, как и выше.

Кроме того, вам может не понравиться использовать ID вообще, вы можете использовать какой-либо другой уникальный идентификатор - как ник.

Так что URL может выглядеть так:

люди/rpm1984

Чтобы сделать это, просто изменить свой маршрут:

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

И ваш метод действия:

public ActionResult Profile(string nickname) 
{ 

} 

Код вашего RedirectToAction:

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

Это что после вас?

8

Если вы не хотите, чтобы параметр отображался в адресной строке, вам нужно будет перенести его где-то на сервере между переадресациями. Хорошее место для достижения этого - TempData.Вот пример:

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

А теперь о действии профиля перенаправление извлечь его из 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(); 
} 

Под крышками TempData использует Session для хранения, но он будет автоматически выселил после редиректа , поэтому значение можно использовать только один раз, что вам нужно: сохранить, перенаправить, извлечь.

1

это может быть решением проблемы, когда TempData прошло после обновления страницы: -

когда первый раз, когда вы получаете TempData в методе действия установить его в ViewData & проверки записи, как показано ниже:

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

теперь на Профиле действия:

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(); 
} 
Смежные вопросы