Czy mozna przekazać do kontrolera wartość id/klasy z widoku?

Czy mozna przekazać do kontrolera wartość id/klasy z widoku?
MU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 57
0

Próbuję przekazać wartość znajdującą się w inpucie datowym do kontrolera i zapisac go w bazie. Data wybierana jest na pickerze przez usera i wyświetlana właście w class='finalDate' (mam około 100 wierszy input date z buttonem Save)

View:

Kopiuj
<form action="@Url.Action("Update", "Home"))" method="post">
<tr>
           <td>
                @Html.DisplayFor(modelItem => item.custName)
           </td>
           <td class="choice">
                <input class="finalDate" type="date">                
           </td>
           <td>
                @Html.ActionLink("Save","Update", new { cust = item.custName, manualDate = "{finalDate.value}" }) // przekazuję wartość klasy w taki sposób ale nie działa

           </td>
</tr>
</form>

Kontroler:

Kopiuj
        [HttpPost]
        public ActionResult Update(string cust, DateTime? manualDate)
        {

            _docs.UpdateData(cust, manualDate); //ta metoda przyjmuje 2 parametry i zapisuje wynik do bazy 

            return RedirectToAction("Index");
        }

Kod powyższy nie rzuca żadnego błędu ale zapisu do bazy brak. Stąd moje pytania:

  1. jak powinno się przekazywać do kontrolera wartość z danego id/class w którym jest jakaś wartość (tu: wybrana data przez usera na formularzu)
  2. czy opakowanie tabelki w <form action="@Url.Action("ActionName", "Home"))" method="post"> pozwala tu na wysłanie danych do bazy? I czy robi się tak za każdym razem jak wysyłam dane na serwer?
Robert M.
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
2

C# ma parser dla danych, zazwyczaj dopasowuje name do tego co masz w atrybutach akcji (lub modelu)

Czyli masz klase

Samochod.Kolor

To w formularzu musisz miec name="Samochod.Kolor" value="aaa"

W akcji

Kopiuj
[HttpPost]
public async Task<IActionResult) Update(Samochod postModel){
var kolor = postModel.Kolor;

}

W drugim wypadku masz

name="Kolor" value ="bbb"

W akcji

Kopiuj
[HttpPost]
public async Task<IActionResult) Update(string kolor){
var result = $"Kolor samochodu {kolor}";

}
MU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 57
0

Ok, właśnie doczytałem, że tak to działa dla inputów - dopasowuje name do parametrów Action. A jak to się ma w przypadku alternatywnej metody (tak przynajmniej sądzę) czyli użycia @using (Html.BeginForm)? Czy tutaj jak wstawiam jakiś obiekt modelu albo diva z jakimś id i name to tak samo zostana pobrane do kontrolera?

poniżej urposzczony przykład:

Kopiuj
@using (Html.BeginForm("Update","Home",FormMethod.Post) {

                <td class="dataWykonania">

                    @Html.DisplayFor(modelItem => item.Data_dokumentu)
                </td>

                    <select id="decisionList">
                        <option name="option" selected></option>
                        <option name="option">Brak</option>
                        <option name="option">Anulacja</option>
                        <option name="option">Storno</option>
                        <option name="option">Data płatności</option>
                        <option name="option">Data ręczna</option>
                    </select>
}

Czy do kontrolera zostanie przekazana z defaultu wartość dla item.Data_dokumentu oraz wartość tesktową dla danej opcji (np. wartość Anulacja gdy wybiorę opcję trzecią)?

Wtedy taki kontroler powinnien wyglądać tak? Właśnie taki konkretnie przypadek mam do zrobienia i zastanawiam się jakbym mógł przekazać te wartości do kontrolera:

Kopiuj
        public ActionResult Update(Customers cust, int option)
        {
            // jakis kod

            return View();
        }
WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5269
2

Możesz stworzyć model który będzie zawierał w sobie wszystko to, co chcesz przesłać zamiast rozbijać to na N parametrów

Generalnie:

Model Binding in ASP.NET Core

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.