ASP.Net MVC Jak przekazać dane z widoku do kontrolera [zamknięte]

81

Jestem zupełnie nowy w ASP.Net i jestem pewien, że jest to bardzo podstawowe pytanie Mam widok, w którym znajduje się link do wygenerowania raportu, ale aby móc wygenerować raport, muszę poprosić użytkownika o podanie odpowiedniej nazwy tekstu jako dobrze.

Do tej pory mogłem przekazywać dane z serwera do widoku za pomocą modeli przekazanych z mojego kontrolera do przeglądania, ale nie jestem pewien, jak przekazać dane z widoku do mojego kontrolera.

W tym przypadku muszę tylko przekazać ciąg z widoku do kontrolera.

Wszelkie rady z przykładem będą mile widziane.

AKTUALIZACJA

Rozumiem, że muszę wysłać dane z powrotem na serwer, ale jak to się dzieje w postaci kodu i kontrolera razorhtml?

Ahmed
źródło
użytkownik musi coś opublikować - widok nie wie bezpośrednio, jak komunikować się z kontrolerem.
Daniel A. White
Jeśli przeczytasz dokumentację Microsoft, zobaczysz, że NIE wyjaśnia ona, jak to zrobić.
Paul McCarthy

Odpowiedzi:

133

Możesz to zrobić za pomocą ViewModels, na przykład tego, jak przekazałeś dane z kontrolera do wyświetlenia.

Załóżmy, że masz taki model widoku

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

aw swojej akcji GET

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

a Twój widok musi być silnie wpisany do ReportViewModel

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

oraz w metodzie akcji HttpPost na kontrolerze

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

LUB Po prostu możesz to zrobić bez klas POCO (Viewmodels)

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

aw akcji HttpPost użyj parametru o takiej samej nazwie, jak nazwa pola tekstowego.

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

EDYCJA: Zgodnie z komentarzem

Jeśli chcesz wysłać do innego kontrolera, możesz użyć tego przeciążenia metody BeginForm.

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

Przekazywanie danych z metody akcji do wyświetlenia?

Możesz użyć tego samego modelu widoku, po prostu ustaw wartości właściwości w swojej metodzie akcji GET

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

i Twoim zdaniem

@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
źródło
Czy w przedstawionej przez Ciebie opcji / metodzie 2 (bez modelu) jest sposób na określenie nazwy kontrolera? ponieważ kontroler, który powinien odebrać tę prośbę o wpis, jest inny niż kontroler tego widoku ..
Ahmed
@Ahmed: Sprawdź zaktualizowaną odpowiedź. Możesz użyć określonego przeciążenia metody BeginForm.
Shyju
4
wspaniale, dzięki za wspaniałą odpowiedź ...
Ahmed,
Świetnie, szukam już od kilku godzin. Dzięki!
Dan Beaulieu
Dzięki!! Bardzo jasna odpowiedź. W moim przypadku w akcji HttpPost nie musiałem używać parametru o takiej samej nazwie, jak nazwa pola tekstowego. Tylko umieść obiekt modelu jako parametr, mogę być w stanie pobrać wartości.
Hnin Htet Htet Aung
27

Jeśli nie chcesz / nie musisz pisać:

@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)
{

Zwróć uwagę, że identyfikator raportu w nowej części {} odpowiada identyfikatorowi raportu w parametrach akcji, w ten sposób możesz dodać dowolną liczbę parametrów, ale nie więcej niż 2 lub 3 (niektórzy będą się zawsze argumentować) powinieneś przekazywać model przez POST ( jak w innej odpowiedzi)

Edycja : dodano null dla poprawnego przeciążenia, jak wskazano w komentarzach. Istnieje wiele przeciążeń i jeśli określisz zarówno akcję, jak i kontroler, potrzebujesz zarówno routeValues, jak i htmlAttributes. Bez kontrolera (tylko podpis + akcja) potrzebne są tylko wartości routeValues, ale najlepszym rozwiązaniem może być zawsze określenie obu.

wolność
źródło
4
Po prostu powiadom każdego, kto natknie się na tę prostą odpowiedź, dodaj wartość null po uwzględnieniu wartości trasy [new {reportID = 1}], w przeciwnym razie spróbuje wziąć je jako htmlAttributes i nie przejdą,
Hardycore
22
<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

kontroler:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}
Azure SME
źródło
1
<input type = "valueINeed" type = "text"> powinno mieć wartość <input name = "valueINeed" type = "text">
GregH,
Thnx. Zaktualizowana odpowiedź.
Azure SME