Как передать объект в списке в другую функцию индекса контроллера? - PullRequest
0 голосов
/ 19 октября 2018

Я новичок в asp.net-mvc.У меня есть userList, который содержит информацию о нескольких пользователях. После проверки с использованием имени пользователя, введенного пользователем, с именем пользователя внутри списка, как передать сопоставленного пользователя другому контроллеру с помощью метода RedirectToAction?

LoginController.cs

public ActionResult Index()
{
    return View();
}

[HttpPost]
public ActionResult Authorise(Models.User x)
{
    List<User> userList = new List<User>();
    userList.Add(new User { UserName = "A", Password = "A", EmpName ="A", EmpID = "ABC123", EmpEmail = "test@gmail.com", EmpContact = "1300882525" });
    userList.Add(new User { UserName = "B", Password = "B", EmpName = "B", EmpID = "ABC123", EmpEmail = "test@gmail.com", EmpContact = "1300882525" });
    userList.Add(new User { UserName = "C", Password = "C", EmpName = "C", EmpID = "ABC123", EmpEmail = "test@gmail.com", EmpContact = "1300882525" });
    userList.Add(new User { UserName = "E", Password = "E", EmpName = "E", EmpID = "ABC123", EmpEmail = "test@gmail.com", EmpContact = "1300882525" });

    var username = x.UserName;
    var pass = x.Password;

    //String UserName = Request.Form["UserName"];
    //String Password = Request.Form["Password"];

    if (ModelState.IsValid)
    {
        if (!userList.Exists(y => y.UserName == username) && !userList.Exists(y => y.Password == pass))
        {
            TempData["Message"] = "Wrong username or password.";
            return RedirectToAction("Index");
        }
        else if (userList.Exists( y => y.UserName == username) )
        {
            return RedirectToAction("Index", "User");
        }
    }

    return View("Index");
}

public ActionResult LogOut()
{
    Session.Abandon();
    return RedirectToAction("Index", "Login");
}

UserController.cs Как передать объект внутри этого контроллера

public ActionResult Index() 
{            
    List<PurchaseHistory> List1 = new List<PurchaseHistory>();

    List1.Add(new PurchaseHistory { empName = "A", ItemName = "Speaker", DateTime = new DateTime(2018,12,25) });
    List1.Add(new PurchaseHistory { empName = "B", ItemName = "Speaker", DateTime = new DateTime(2018, 12, 25) });
    List1.Add(new PurchaseHistory { empName = "C", ItemName = "Speaker", DateTime = new DateTime(2018, 12, 25) });
    List1.Add(new PurchaseHistory { empName = "C", ItemName = "Laptop", DateTime = new DateTime(2018, 12, 25) });
    List1.Add(new PurchaseHistory { empName = "E", ItemName = "Speaker", DateTime = new DateTime(2018, 12, 25) });
    List1.Add(new PurchaseHistory { empName = "E", ItemName = "Speaker", DateTime = new DateTime(2018, 12, 25) });

    if (List1.Exists( y => y.empName == x.EmpName))
    {
        x.ListPurchaseHistory = List1.FindAll(y => y.empName.Equals(x.EmpName));
    }

    return View(x);
}

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вы можете передать объект как RouteData

return RedirectToAction("Action", "Controller", new { data = "YourData" });

С целевым действием

public ActionResult Action(string data) {
  //action
}

Однако имейте в виду, что он сделает перенаправление, которое эффективно Get request, и вы прошлиданные хранятся в URL.Не рекомендуется передавать сложный объект с запросами get.Если ваш объект достаточно большой, это может привести к HTTP Error 414. The request URL is too long.

Лучшим решением было бы использовать Session, TempData или другой контейнер данных.

Для сеанса, который был бы похож на

this.Session["User"] = user;

и получить его с помощью

User user  = (User)this.Session["User"];

Основываясь на использовании, вам может потребоваться проверить этот сеанс на нулевое значение.

Если вы в конечном итоге используете другой контейнер, выНельзя использовать ViewBag, поскольку Viewbag хранит свои данные только для того запроса, для которого он был настроен.Поскольку RedirectToAction сделает новый запрос Http, ваш ViewBag больше не доступен.

0 голосов
/ 19 октября 2018

Вне контекста, я хотел бы поднять предупреждения безопасности в вашем коде.

О поиске пользователя

if (!userList.Exists(y => y.UserName == username) && 
    !userList.Exists(y => y.Password == pass))
{
    TempData["Message"] = "Wrong username or password.";
    return RedirectToAction("Index");
}

Здесь вы подтверждаете, что существует определенныйимя пользователя в базе данных и существует определенный пароль в базе данных .Это означает, что вы можете аутентифицировать пользователя с помощью чужого пароля!

Я предлагаю сначала найти правильного пользователя и , а затем сравнить пароль.

var user = userList.SingleOrDefault(y => y.UserName == username);
if (user != null)
{
    if (user.Password != null && user.Password.Equals(pass))
    {
        // ok
    }
    else
    {
        TempData["Message"] = "Wrong username or password.";
        return RedirectToAction("Index");
    }
}
else
{
    TempData["Message"] = "Wrong username or password.";
    return RedirectToAction("Index");
}

О будущемхранение паролей

Во-вторых, вы не хэшируете пароли пользователей.Это классическая проблема безопасности.См. Хеширование соленых паролей - правильное выполнение .

Об аутентификации

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

0 голосов
/ 19 октября 2018

Я вижу два варианта:

  1. использовать TempData
  2. использовать анонимный объект и изменять сигнатуру действия:

    RedirectToAction("Index", new { user = your_user })
    
    // ...
    
    public ActionResult Index(User user) 
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...