2014-09-02 10 views
6

w widoku silnie typami widoku przeciwko @model System.Tuple<Person, List<Survey>>Jak przekazać wartości przez ViewData do edytora szablonów przez @ Html.EditorFor

używam Wewnątrz każdej pętli for-:

@Html.EditorFor(x => survey.Questions) 

uczynienia pytania w `Ankieta. Działa bez zarzutu.

Teraz chciałbym również przekazać dodatkowe dane do niestandardowego szablonu edytora. Zrobiłem:

@Html.EditorFor(x => survey.Questions, new { htmlAttributes = new { PersonId = 1000 } }) 

a następnie w Edtior Szablon chcę odnieść się do tego PersonId i wyświetlić go.

Template Editor to zrobiłem (skrót dla celów pytanie):

@using WebApplication2.Models 
    @model Question 
    <div> 
     @ViewData["PersonId"] 
    </div> 

ale nic nie pokazuje się.

Jak poprawnie przekazać PersonId = 1000 do tego EditorTemplate.

Odpowiedz

2

Spróbuj:

@ViewData["htmlAttributes"]["PersonId"] 

Zewnętrzna anonimowy obiekt jest co zapełnia ViewData. Jednak, jeśli użyjesz powyższych, musisz się upewnić, że faktycznie istnieje ViewData["htmlAttributes"], zanim spróbujesz odwołać się do "PersonId".

+0

I wklejane to i dostaję błąd składni: 'Błąd 1 Nie można zastosować indeksowania z [] do wyrażenia typu 'object'' – Yoda

+0

Dobrze, więc zrobiłem dochodzenie i wiele osób ma z tym problem. Okazuje się, że musi on zostać dodany do przeglądania danych za pomocą tej metody '@ Html.ViewData.Add (" PersonId ", tutaj potrzebuję utworzyć instancję obiektu)' przed 'EditorFor'. Problem polega na tym, że nie mam ideału, jak przekazać DOWOLNY drugi parametr. Chciałbym po prostu podać np. Int '10'. – Yoda

+0

Ok Zrobiłem '@ {Html.ViewData.Add (" PersonId ", 100);}' wcześniej występowały problemy z składnią, ale nie wiem jak wyświetlić je w innym widoku. – Yoda

2

Wygląda na to, że nie ustawiono ViewData. Musisz ustawić ViewData w kontrolerze, który zwraca ten widok. Wystarczy ViewData["PersonId"] = 10

+0

Następnie jak wyświetlić go w widoku? – Yoda

+0

I dlaczego nie mogę dodać go w widoku przez: '@ {Html.ViewData.Add (" PersonId ", 100);}'? – Yoda

+0

Widziałeś ten post? http://stackoverflow.com/questions/7032449/passing-extra-data-to-editortplate –

14

Po przeszukaniu znalazłem następującą odpowiedź na przepełnienie stosu dla iteracji poprzez zagnieżdżone właściwości. Nie udało mi się przekonwertować rzutowania na "dynamiczny", ale użycie odbicia przywróciło poprawnie zagnieżdżony obiekt anonimowy. https://stackoverflow.com/a/13981462/1046155

Jednakże, jeśli intencją przechodząc tylko atrybuty HTML, wystarczy podać je kolejno jako takie:

@Html.EditorFor(x => survey.Questions, new { PersonId = 1000, PersonName = "John", PersonAge=10, etc... }) 

i korzystać z nich w edytorze poprzez:

<div> 
    @ViewData["PersonId"] 
    @ViewData["PersonName"] 
    @ViewData["PersonAge"] 
    etc... 
</div> 
+0

@ ViewBag.PersonId itp. Działa równie dobrze. –

Powiązane problemy