ASP.Net MVC Як передавати дані з подання на контролер [закрито]


81

Я абсолютно новачок у ASP.Net, і я впевнений, що це дуже базове питання. У мене є подання, в якому є посилання для створення звіту, але для створення звіту я повинен попросити користувача вказати відповідне текстове ім'я як Ну.

Дотепер я міг передавати дані із сервера на перегляд, використовуючи Моделі, передані з мого контролера на перегляд, але я не впевнений, як передати дані з подання на мій контролер.

Мені просто потрібно передати рядок з подання контролеру в цьому випадку.

Будь-яка порада на прикладі буде вдячна.

ОНОВЛЕННЯ

Я розумію, що я повинен відправляти дані назад на сервер, але як це реалізується у вигляді коду razorhtml та контролера?


користувач повинен щось розмістити - подання не знає безпосередньо, як зв’язатися з контролером.
Даніель А. Вайт

Якщо ви прочитаєте документацію Microsoft, то побачите, що вона НЕ пояснює, як це зробити.
Пол Маккарті,

Відповіді:


133

Ви можете зробити це за допомогою ViewModels, наприклад, як ви передавали дані з контролера для перегляду.

Припустимо, у вас є така модель перегляду

public class ReportViewModel
{
   public string Name { set;get;}
}

і у вашому GET Action,

public ActionResult Report()
{
  return View(new ReportViewModel());
}

і ваш погляд повинен бути чітко набраний ReportViewModel

@model ReportViewModel
@using(Html.BeginForm())
{
  Report NAme : @Html.TextBoxFor(s=>s.Name)
  <input type="submit" value="Generate report" />
}

і у вашому методі дії HttpPost у вашому контролері

[HttpPost]
public ActionResult Report(ReportViewModel model)
{
  //check for model.Name property value now
  //to do : Return something
}

АБО просто, ви можете зробити це без класів POCO (Viewmodels)

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

а у своїй дії HttpPost використовуйте параметр з тим самим іменем, що і ім’я текстового поля.

[HttpPost]
public ActionResult Report(string reportName)
{
  //check for reportName parameter value now
  //to do : Return something
}

EDIT: Відповідно до коментаря

Якщо ви хочете розмістити повідомлення на іншому контролері, ви можете використовувати це перевантаження методом BeginForm.

@using(Html.BeginForm("Report","SomeOtherControllerName"))
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

Передача даних із методу дії для перегляду?

Ви можете використовувати ту саму модель подання, просто встановіть значення властивостей у своєму методі дії GET

public ActionResult Report()
{
  var vm = new ReportViewModel();
  vm.Name="SuperManReport";
  return View(vm);
}

і на ваш погляд

@model ReportViewModel
<h2>@Model.Name</h2>
<p>Can have input field with value set in action method</p>
@using(Html.BeginForm())
{
  @Html.TextBoxFor(s=>s.Name)
  <input type="submit" />
}

У варіанті / способі 2, який ви представили (без моделі), є спосіб вказати ім'я контролера? тому що контролер, який повинен отримати цей запит на повідомлення, відрізняється від контролера цього погляду ..
Ахмед

@Ahmed: Перевірте оновлену відповідь. Ви можете використовувати конкретне перевантаження методу BeginForm.
Shyju

4
чудово, дякую за чудову відповідь ..
Ахмед

Приємно, я шукаю вже кілька годин. Дякую!
Dan Beaulieu

Дякую!! Дуже чітка відповідь. Для мого випадку, у дії HttpPost мені не потрібно було використовувати параметр з таким самим іменем, що і ім'я текстового поля. Тільки покладіть об'єкт моделі як параметр, я зможу отримати значення.
Hnin Htet Htet Aung

27

Якщо ви не хочете / потрібно розміщувати повідомлення:

@Html.ActionLink("link caption", "actionName", new { Model.Page })  // view's controller
@Html.ActionLink("link caption", "actionName", "controllerName", new { reportID = 1 }, null);

[HttpGet]
public ActionResult actionName(int reportID)
{

Зверніть увагу, що reportID у новій частині {} збігається з reportID у параметрах дії, ви можете додати будь-яку кількість параметрів таким чином, але більше 2 або 3 (деякі будуть сперечатися завжди) вам слід передавати модель через POST ( відповідно до іншої відповіді)

Редагувати : додано нуль для правильного перевантаження, як зазначено в коментарях. Існує низка перевантажень, і якщо ви вкажете обидва action + контролер, то вам потрібні і routeValues, і htmlAttributes. Без контролера (лише підпис + дія) потрібні лише routeValues, але найкращою практикою є завжди вказувати обидва.


4
Просто FYI кожному, хто стикається з цією простою відповіддю, додайте нуль після включення значень маршруту [new {reportID = 1}], інакше він спробує прийняти їх як htmlAttributes, і вони не пройдуть,
Hardycore

22
<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

контролер:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}

1
<input type = "valueINeed" type = "text"> має бути <input name = "valueINeed" type = "text">
GregH

Thnx. Оновлена ​​відповідь.
Azure SME
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.