MVC przekazanie modelu z partialview do kontrolera

0

Witam mam problem z (jak w temacie) przekazaniem modelu do kontrolera.

Tak wygląda tworzenie partialview:

@Html.Partial("Weather", ShopB2B.Controllers.HomeController.GetWeather())
 

Gdzie metod GetWeather zwraca dane początkowe zaimplementowanego modelu Weather, która wygląda tak:

    public class Weather_m
    {
        
        public IEnumerable<SelectListItem> Miasta_dropdown { get; set; }

        public string Temperatura { get; set; }
    }
 

Dane te są potrzebne do zapełnienia DropDownListFor

@model ShopB2B.Models.Weather_m
   

@using (@Html.BeginForm("PogodaPrzekaz", "Home", new { weather = Model }, FormMethod.Post))
{
   
    <table>
        <tr>
            <td>@Html.DropDownListFor(x => x.Miasta_dropdown, Model.Miasta_dropdown)</td>
        </tr>
        <tr>
            <td>@Html.LabelFor(x => x.Temperatura, Model.Temperatura)</td>
            <td><<input type="submit" value="Wyslij" class="submitLink" style=" height: 40px;" /></td>
        </tr>
    </table>

}

Następnie chciałbym ten model zwrócić do kontrolera i tam sprawdzić, która wartość została zaznaczona obrobić te dane i wysłać model podobnie.
Czy ktoś ma pomysł jak to zrobić??????

0

Potrzebujesz ViewModelu, który będzie zawierał IEnumerable<SelectListItem> oraz jakieś id wybranego elementu. View niech wyświetla ten ViewModel, a DropDown musisz odpowiednio skonfigurować podając mu zarówno listę wartości, jak i pole ViewModelu do którego ma trafić wybrana wartość. Oczywiście metody w Controlerze też powinny wyświetlać/zwracać obiekt ViewModelu.

P.S. Co to za _m na końcu nazwy klasy? o.O

0

Trochę nie rozumiem, przecież zrobiłem to samo tylko nie w ViewModel tylko Modelu Weather_m (dobra niech będzie bez _m - zaznaczone testowo, abym pamiętał nad którym pracuję).
PartialView (chce żeby był partial bo przyszłościowo chce go obrabiać w ajax) dostawał model Weather_m wypełniony przez kontroler. Weather_m zawierał IEnumerable<SelectListItem>. DropDown wydaje mi się że też jest dobrze wypełniony bo:
podając mu zarówno listę wartości, jak i pole Modelu do którego ma trafić wybrana wartość

 
@Html.DropDownListFor(x => x.Miasta_dropdown, Model.Miasta_dropdown)

Czyżby źle był wypełniony ten DropDownListFor?????

0

Wydaje mi się, że raczej:

@Html.DropDownListFor(x => x.WybranaWartość, x => x.ListaWartościDoWyboru);
0

ja bym to tak zrobił

@using (Html.BeginForm("PogodaPrzekaz", "Home", "POST"))
{
    @Html.DropDownListFor(model => model.CityID, new SelectList(Model.Miasta_dropdown, "id", "name"))

    <input type="submit" value="wybierz" />
};

dodaj właściwość CityID do modelu widoku. Dwa ostatnie argumenty przekazane do SelectList dotyczą Twojej encji.

0

Ok, to jak najbardziej działa tylko w dalszym ciągu nie przekazuje formularz wypełnionego new { weather = Model } do kontrolera, cały czas wartość po wciśnięciu Wyslij w kontrolerze pozostaje null???

1

Nie musisz używać typów anonimowych new { weather = Model }
Wystarczy, że w metodzie akcji w kontrolerze dodasz oczekujący parametr Twojego modelu widoku.

[httpPost]
public ActionResult PogodaPrzekaz(TwójViewModel viewmodel)
 
0

RideorDie - JESTEŚ GENIALNY zrobiłem tak:

 
@using (@Html.BeginForm("PogodaPrzekaz", "Home", FormMethod.Post))
{
    <table>
        <tr>
            @*<td>@Html.DropDownListFor(x => x.Miasta_dropdown, Model.Miasta_dropdown)</td>*@
            <td>@Html.DropDownListFor(model => model.idmiasta, new SelectList(Model.Miasta_dropdown, "Value", "Text"))</td>
        </tr>
        <tr>
            <td>@Html.LabelFor(x => x.Temperatura, Model.Temperatura)</td>
            <td><<input id="test2" type="submit" value="Wyslij" class="submitLink" style=" height: 40px;" /></td>
        </tr>
    </table>

i zwróciło mi do kontrolera - Model Weather_m z parametrem idmiasta ustawionym, pozostałe zaś wartości puste. W związku z tym mam pytanie jak to zadziałało, jak działają te encje, rozumiem że przypisało mi z Value wartość do idmiasta, a co w takim razie się dzieje Text. Skąd mam wiedzieć że coś takiego mogę użyć przecież w klasie SelectList nie ma takiej informacji (w każdym razie niezbyt zrozumiałe jak dla mnie).
I drugie pytanie dlaczego @html.LabelFor(x => x.Temperatura, Model.Temperatura) również nie uzupełnił wartości i nie było jej w Modelu Weather_m
Model wygląda tak:

public class Weather_m
{
    public IEnumerable<SelectListItem> Miasta_dropdown { get; set; }  
    public string Temperatura { get; set; }
    public int idmiasta { get; set; }
}

I co zrobić jak muszą też zwrócić IEnumerable<SelectListItem>?

Z góry dzięki za odpowiedź, bardzo mi pomożesz

1

Przecież to wszystko pisze w googlach, a nawet w podpowiedziach Visual Studio. Pierwszy lepszy link http://odetocode.com/blogs/scott/archive/2013/03/11/dropdownlistfor-with-asp-net-mvc.aspx. Tak samo z label.. Może potrzebujesz TextBoxFor ?

Jak chcesz zwrócić z powrotem IEnumerable<selectlistitem> używasz metody pomocniczej

Html.HiddenFor(model => model.Miasta_dropdown)

1 użytkowników online, w tym zalogowanych: 0, gości: 1