2012-10-19 15 views
5

Mam aplikację ASP.NET MVC, która wyświetla listę elementów. Moim zdaniem Strona I pętli nad elementami i czyni każdą pozycję z częściowym widokiem, tak:Html.HiddenFor binding do niewłaściwego elementu

@foreach(var item in Model.items) 
{ 
    <li> 
     @Html.Partial("ItemView", item) 
    </li> 
} 

W widoku elementu, ja owinąć każdą pozycję z formularza, który ma przycisk „Usuń”, jak poniżej:

@using(Html.BeginForm(...)) 
{ 
    @Html.HiddenFor(m=>m.Id) 
    <label>@Model.Name (@Model.Id)</label> 
    <input type="submit" value="Delete"/> 
} 

Pozycje są renderowane prawidłowo, strona wynikowa ma ładną listę wszystkich pozycji z ich własnymi nazwami i identyfikatorami wyświetlanymi.

EDYCJA: To samo dzieje się z @Hidden, widocznie, w przeciwieństwie do tego, co napisałem wcześniej.

Ponadto dzieje się tak tylko przy drugim renderowaniu formularza (to znaczy po kliknięciu jednego z przycisków Delete), gdy wszystko działa po raz pierwszy. Moje metody działania wyglądają następująco:

public ActionResult AllItems() 
{ 
    var model = new AllItemsModel(); 
    return PartialView(model); 
} 

public ActionResult Delete(DeleteModel model) 
{ 
    .... Perform the delete ... 
    return PartialView("AllItems", new AllItemsModel()); 
} 

Dlaczego tak się dzieje?

Odpowiedz

8

Podejrzewam, że tak się dzieje, ponieważ masz już parametr Id w swoim RouteData:

public ActionResult SomeAction(int id) 
{ 
    var model = ... 
    return View(model); 
} 

i zwróciły stronę z /somecontroller/someaction/123. Pomocnik HiddenFor używa teraz identyfikatora z wartości trasy, a nie id elementu. Spróbuj zmienić nazwę właściwości w modelu widoku elementów na coś innego niż id. Na przykład ItemId.

Inną możliwością jest, że problem występuje tylko po odświeżeniu, a nie po początkowej renderowaniu strony. Pokazywanie akcji POST może pomóc w dalszym badaniu tej możliwości.


UPDATE:

Dobrze, że teraz wykazały swoje rzeczy akcji POST są znacznie bardziej jasne:

public ActionResult Delete(DeleteModel model) 
{ 
    .... Perform the delete ... 
    return PartialView("AllItems", new AllItemsModel()); 
} 

są w zasadzie tworzenia nowego modelu widok tu i przepuszczenie do widoku częściowego. Ale pomocnicy HTML zawsze używają wartości z ModelState podczas wiązania. I dopiero potem wartość z twojego modelu widoku. Jeśli więc zamierzasz zmodyfikować właściwości modelu w akcji POST, upewnij się, że najpierw usunąłeś tę wartość z ModelState. W przykładzie, ponieważ zostały całkowicie porysowane całą widoku modelu (tworząc new AllItemsModel()) można usunąć całą ModelState:

public ActionResult Delete(DeleteModel model) 
{ 
    .... Perform the delete ... 

    // Clear the modelstate otherwise the view will use the values that were initially posted 
    // and not the values from your view model 
    ModelState.Clear(); 
    return PartialView("AllItems", new AllItemsModel()); 
} 

To zachowanie jest zgodne z projektem i odnosi się do wszystkich pomocników HTML nie tylko pomocnika HiddenFor.

+0

Wow, doskonała obserwacja. Sprawdzę, myślę, że go nie mam. – zmbq

+0

Twoja pierwsza sugestia nie była poprawna, ale twoja druga wydaje się obiecująca. Szkoda, że ​​nie mogę dać +1 dwukrotnie ... Sprawdzę to. – zmbq

+0

Tak, to było dokładnie to. Wielkie dzięki! – zmbq

Powiązane problemy