Załóżmy, że mam ViewModel jak
public class AnotherViewModel
{
public string Name { get; set; }
}
public class MyViewModel
{
public string Name { get; set; }
public AnotherViewModel Child { get; set; }
public AnotherViewModel Child2 { get; set; }
}
W widoku mogę renderować częściowe za pomocą
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
W części zrobię
<%= Html.TextBox("Name", Model.Name) %>
or
<%= Html.TextBoxFor(x => x.Name) %>
Jednak problem polega na tym, że oba będą renderować name = "Name", podczas gdy ja potrzebuję mieć name = "Child.Name", aby spinacz modelu działał poprawnie. Lub name = "Child2.Name", gdy renderuję drugą właściwość przy użyciu tego samego widoku częściowego.
Jak sprawić, by widok częściowy automatycznie rozpoznawał wymagany prefiks? Mogę podać to jako parametr, ale jest to zbyt niewygodne. Jest to jeszcze gorsze, gdy chcę, na przykład, renderować go rekurencyjnie. Czy istnieje sposób renderowania widoków częściowych z prefiksem, czy jeszcze lepiej, z automatyczną rekonstrukcją wywołującego wyrażenia lambda, tak aby
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
automatycznie doda poprawne „Dziecko”. prefiks do wygenerowanych ciągów nazwy / identyfikatora?
Mogę zaakceptować dowolne rozwiązanie, w tym zewnętrzne silniki i biblioteki widoku - faktycznie używam Spark View Engine („rozwiązuję” problem za pomocą jego makr) i MvcContrib, ale nie znalazłem tam rozwiązania. XForms, InputBuilder, MVC v2 - każde narzędzie / insight zapewniające tę funkcjonalność będzie świetne.
Obecnie sam myślę o zakodowaniu tego kodu, ale wydaje mi się, że to strata czasu, nie mogę uwierzyć, że ta trywialna rzecz nie jest już zaimplementowana.
Może istnieć wiele rozwiązań ręcznych i wszystkie z nich są mile widziane. Na przykład mogę zmusić moje części składowe, aby były oparte na IPartialViewModel <T> {public string Prefix; Model T; }. Ale wolałbym jakieś istniejące / zatwierdzone rozwiązanie.
UPDATE: tam podobne pytanie bez odpowiedzi tutaj .
helper.ViewData.TemplateInfo.HtmlFieldPrefix
w postaci{oldprefix}.{newprefix}