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?
asp.net
asp.net-mvc
Ahmed
źródło
źródło
Odpowiedzi:
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" /> }
źródło
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.
źródło
<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) { //.... }
źródło