@birinci2012

Как сохранить информации в Лист на ASP.NET MVC 4.0?

Здраствуйте.
Я новичок в MVC.
У меня такой класс есть.
class UserInfo
{
  public string Name{get;set;}
  public string Surname{get;set;}
}

И меня такой контроллер есть.
public class HomeController : Controller
    {
        //
        // GET: /Home/

        List<UserInfo> Users = new List<UserInfo>(); 
        public ActionResult Index()
        {
            return View();
        }

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

        [HttpPost]
        public ActionResult Create(UserInfo userInfo)
        {
            if (ModelState.IsValid)
            {
                Users.Add(userInfo);
                return RedirectToAction("Index");
            }
            return View();
        }

    }

И каждый когда я нажимаю кнопку Create в браузере List Users оказывается пустым.
Почему так происходит? В чем проблема? Как сохранит данные в листе?
  • Вопрос задан
  • 3261 просмотр
Решения вопроса 1
Потому что у вас видимо разные экземпляры контроллеров. Сделайте поле Users статическим например.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Класс модели тоже должен быть публичным.

Советую, Как новичку, пройти два мануала по asp.net mvc 3/4 находящиеся на официальном сайте - на одном магазин cd дисков и видеокаталог
www.asp.net/mvc/tutorials/mvc-4/getting-started-wi...

www.asp.net/mvc/tutorials/mvc-music-store/mvc-musi...

Они Вам неплохо обьяснят, что и как, но, к сожалдению, только основы, дальше придёся лезть в дебри самому.
, дальше можете, например, обращаться ко мне, я, в принципе не так давно начинал со всем этим работать и сейчас пишу свой вариант домашней веб бухгалтерии на asp.net mvc5, но постараюсь помочь
Ответ написан
Комментировать
Vadimyan
@Vadimyan
Программист C#
Привет. Я согласен с @foxmuldercp - материалы полезные.
static-поле в контроллере - худшее из возможных решений. Архитектура MVC предполагает наличие модели, которую вы игнорируете. Контроллер должен работать с неким репозиторием в части извлечение и сохранения данных. Приведу упрощенный пример
public interface IUsersRepository
{
    UserInfo SaveUserInfo(UserInfo user);
    IReadOnlyCollection<UserInfo> GetUsers();
}


В этом случае ваш контроллер может выглядеть следующим образом:
(Это тестовый пример, на практике нужно использовать DI через IoC-контейнер для внедрения репозитория)
public class HomeController : Controller
{
    private readonly IUsersRepository _usersRepository;
    public HomeController()
    {
        _usersRepository = new UsersRepository();
    }
        
    public ActionResult Index()
    {
        var users = _usersRepository.GetUsers();
        return View(users);
    }

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

    [HttpPost]
    public ActionResult Create(UserInfo userInfo)
    {
        if (ModelState.IsValid)
        {
            _usersRepository.SaveUserInfo(userInfo);
            Users.Add(userInfo);
            return RedirectToAction("Index");
        }
        return View();
    }
}


При этом работа по сохранению пользователей переносится на реализацию интерфейса IUsersRepository. В зависимости от ваших потребностей, вы можете реализовать хранение коллекции пользователей в БД, в файле на диске, в оперативной памяти (для этого нужно либо сделать репозиторий синглтоном, либо заговнокодить статическую коллекцию в нём).
Несколько замечаний напоследок:
1. Репозитории обычно отвечают за работу с конкретным хранилищем данных на уровне сохрани/удали/извлеки, а места для бизнес-логики не остаётся. Поэтому звеньев может быть еще больше - есть сервис бизнес-логики для работы с пользователями, который через репозиторий извлекает данные, а после формирует модель для отдачи контроллеру. Таким образом из класса EF code first Person может формироваться модель UserInfo.
2. Еще раз напомню про материалы @foxmuldercp , которые на начальных этапах изучения mvc могут быть очень полезны.
Ответ написан
Комментировать
@mrUlugbek
да MVC 5 они включили Bootstrap
Ответ написан
Я не понял, а модель-то кто будет передавать во View, дядя Вася что ли?
Вы вызываете свой индекс без модели. Это первое.
Второе, как уже сказали: при каждом новом запросе к серверу создаётся новый экземпляр контроллера. Т.е. при создании пользователя создаётся первый контроллер и пользователь добавляется в его лист.
При вызове Index создаётся другой контроллер, список которого пуст. Поэтому реализуйте хранилище для тестирования, например статичный класс MemoryUserRepository и засуньте свой лист туда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы