Подтвердить что ты не робот

Использование 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-адресе. Как я могу скрыть их, а также могу ли я скрыть имя действия? Направляйте мне правильный путь с помощью некоторых примеров.

4b9b3361

Ответ 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();
}