ASP.Net MVC Как передавать данные из представления в контроллер [закрыто]

81

Я совершенно не знаком с ASP.Net, и я уверен, что это очень простой вопрос. У меня есть представление, в котором есть ссылка для создания отчета, но для создания отчета я должен попросить пользователя предоставить подходящее текстовое имя как хорошо.

До сих пор я мог передавать данные с сервера для просмотра с использованием моделей, переданных с моего контроллера для просмотра, но я не уверен, как передавать данные из представления в мой контроллер.

В этом случае мне просто нужно передать строку из представления в контроллер.

Любые советы с примером будут оценены.

ОБНОВИТЬ

Я понимаю, что должен отправить данные обратно на сервер, но как это реализовать в виде кода и контроллера razorhtml?

Ахмед
источник
пользователь должен что-то опубликовать - представление напрямую не знает, как взаимодействовать с контроллером.
Дэниел А. Уайт
Если вы прочитаете документацию Microsoft, вы увидите, что в ней НЕ объясняется, как это сделать.
Пол Маккарти

Ответы:

133

Вы можете сделать это с помощью ViewModels, например, как вы передали данные из вашего контроллера для просмотра.

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

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

и в вашем действии GET,

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
}

РЕДАКТИРОВАТЬ: согласно комментарию

Если вы хотите отправить сообщение другому контроллеру, вы можете использовать эту перегрузку метода 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" />
}
Shyju
источник
В представленном вами варианте / методе 2 (без модели) есть способ указать имя контроллера? потому что контроллер, который должен получить этот почтовый запрос, отличается от контроллера этого представления ..
Ахмед
@Ahmed: Проверьте обновленный ответ. Вы можете использовать специальную перегрузку метода BeginForm.
Shyju 02
4
отлично, спасибо за отличный ответ ..
Ахмед
Отлично, уже несколько часов ищу. Благодаря!
Дэн Болье,
Благодаря!! Очень четкий ответ. В моем случае в действии 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 ( согласно другому ответу)

Изменить : добавлен нуль для правильной перегрузки, как указано в комментариях. Существует ряд перегрузок, и если вы укажете и действие + контроллер, вам понадобятся как routeValues, так и htmlAttributes. Без контроллера (только заголовок + действие) необходимы только routeValues, но лучше всегда указывать и то, и другое.

свобода
источник
4
К вашему сведению всем, кто сталкивается с этим простым ответом, добавьте null после включения значений вашего маршрута [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)
{
   //....
}
Azure SME
источник
1
<input type = "valueINeed" type = "text"> должен быть <input name = "valueINeed" type = "text">
GregH
Спасибо. Обновленный ответ.
Azure SME