Использование RedirectToAction в asp.net mvc
Я хочу опубликовать несколько вопросов о ASP.Net MVC
. Я не знаком с веб-разработкой, но я был назначен на веб-часть проекта. Мы делаем следующее: сначала создаем свойства get
и set
для данных человека:
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-адресе. Как я могу скрыть их, а также
могу ли я скрыть имя действия? Направляйте мне правильный путь с помощью некоторых примеров.
Ответы
Ответ 1
Параметр отображается в 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-адрес может выглядеть следующим образом:
люди /rpm 1984
Для этого просто измените маршрут:
routes.MapRoute("PersonCleanRoute",
"people/{nickname}",
new {controller = "Person", action = "Profile"});
И ваш метод действия:
public ActionResult Profile(string nickname)
{
}
И ваш код RedirectToAction:
return RedirectToAction("profile","person",new { nickname = Person.nickname});
Это то, что вы после?
Ответ 2
Если вы не хотите, чтобы параметр отображался в адресной строке, вам нужно будет перенести его где-то на сервере между переадресациями. Хорошее место для достижения этого - TempData
. Вот пример:
public ActionResult Index()
{
TempData["nickname"] = Person.nickname;
return RedirectToAction("profile", "person");
}
И теперь в действии Profile вы перенаправляете его из 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
для хранения, но после перенаправления будет автоматически выведено, поэтому значение можно использовать только один раз, что вам нужно: сохранить, перенаправить, извлечь.
Ответ 3
это может быть решением проблемы, когда TempData ушел после обновления страницы: -
когда вы впервые получаете TempData в методе действий, установите его в ViewData и выполните запись, как показано ниже:
public ActionResult Index()
{
TempData["nickname"] = Person.nickname;
return RedirectToAction("profile", "person");
}
теперь в действии Profile:
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();
}