2016-11-17 2 views
2

У меня есть два метода Create, один из которых украшен HttpGet, а другой с HttpPost. У меня есть создать представление для первого вида:Сохранение данных из html-формы в список

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

<form action="/" method="post"> 
    <input type="text" name="txt" value="" /> 
    <input type="submit" /> 
</form> 

Методы:

List<string> myList = new List<string> { "element1", "element2", "element3" }; 
public ActionResult Create() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Create(string txt) 
    { 
     //myList.Add(Request.Form["txt"]); 
     myList.Add(txt); 
     return View(); 
    } 

Я simly пытается передать данные из моей формы на кнопку, чтобы мой второй Create() и сохранить его до myList.

Мне нужен совет, как это сделать.

+0

.. что не работает? Кажется, что это работает отлично (если ваш атрибут '

+0

@RudiVisser Это просто не добавление в список –

+0

@RobertRoss What вы имеете в виду «не добавлять»?Во втором запросе 'myList' содержит только значения по умолчанию? – feeeper

ответ

3

После того, как вы исправили свою форму (в том, что Вы отправляете обратно маршрут по умолчанию вашего приложения (по умолчанию HomeController.Index() метод), отправив запрос /, вместо того, чтобы ваш метод Create), вы на самом деле правильно добавлять значение в ваш список. Проблема в том, что это значение остается только для текущего запроса.

Чтобы сделать вещи постоянными, вам необходимо рассмотреть уровень сохранения в памяти, в базе данных или в сеансе. Я предоставил полный образец ниже, который использует сеанс, который предоставит вам экземпляр списка для каждого пользователя. Без этого уровня ваш контроллер будет регулярно удаляться после того, как действие завершит обработку, и поэтому поправки к вашему списку не сохраняются. Это обычный жизненный цикл запроса в ASP.NET и имеет смысл, если учесть, что ваше приложение в основном имеет дело только с 1 запросом за раз. Важно отметить, что создание чего-то static не является одной из форм персистентности, поскольку его срок службы и надежность неоспоримы. Он будет работать, но как только ваш пул приложений будет перезагружен (т. Е. Приложение будет уничтожено и перезагружено в памяти), вы снова потеряете все изменения в своем списке.

Я бы предложил вам прочитать на Session State, чтобы точно понять, что происходит внизу. Вкратце, каждому пользователю/уникальному посетителю приложения на вашем сайте будет предоставлен уникальный «идентификатор сеанса», вы можете использовать этот идентификатор сеанса для хранения данных, которые вы хотите использовать на стороне сервера. Вот почему, если вы хотите посетить свой метод Create из отдельных браузеров (или попробовать частный режим), вы будете поддерживать два отдельных списка данных.

View (который также выводит список пользователю):

@model List<string> 
@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

<ul> 
    @foreach(var str in Model) 
    { 
     <li>@str</li> 
    } 
</ul> 

@using (Html.BeginForm()) 
{ 
    <input type="text" name="txt" /> 
    <input type="submit" /> 
} 

содержимое контроллера:

public List<string> MyList 
{ 
    get 
    { 
     return (List<string>)(
      // Return list if it already exists in the session 
      Session[nameof(MyList)] ?? 
      // Or create it with the default values 
      (Session[nameof(MyList)] = new List<string> { "element1", "element2", "element3" })); 
    } 
    set 
    { 
     Session[nameof(MyList)] = value; 
    } 
} 

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

[HttpPost] 
public ActionResult Create(string txt) 
{ 
    MyList.Add(txt); 
    return View(MyList); 
} 
1

Пожалуйста, используйте это:

@using (Html.BeginForm("Create", "Controller", FormMethod.Post)){ 
    <input type="text" name="txt" value="" /> 
    <input type="submit" /> 
} 

Заменить Controller с именем контроллера.

Или просто использовать:

@using (Html.BeginForm()){ 
    <input type="text" name="txt" value="" /> 
    <input type="submit" /> 
} 

При вызове BeginForm() без каких-либо параметров, то по умолчанию использовать один и тот же контроллер/действие, используемое для отображения текущей страницы.

Смежные вопросы