2012-03-25 5 views
1

Ich habe den folgenden Code in einer Editor-Vorlage namens DropDown, die ich mit einem UIHint aufrufen.Wie kann ich auf die enthaltende Modellinstanz in einer Razor-Editor-Vorlage zugreifen?

if (ViewData.ModelMetadata.AdditionalValues.ContainsKey("TemplateControlParameters")) 
{ 
    var cparms = (Dictionary<string, object>)ViewData.ModelMetadata.AdditionalValues["TemplateControlParameters"]; 
    var listName = cparms["SelectListName"].ToString(); 
    list = (SelectList)ViewData[listName]; 
} 

Der SelectListName Steuerparameter sollte an eine SelectList Eigenschaft des ‚äußeren‘ Modell-zu-Punkt, das heißt das Modell, das die Eigenschaft enthält, die von dieser Vorlage bearbeitet wird. Ich kann jedoch keine Möglichkeit finden, auf die enthaltene Modellinstanz zu verweisen, sondern nur auf den enthaltenden Modelltyp. Wie kann ich auf die Instanz des Modells zugreifen, für die diese Vorlage aufgerufen wird?

CLOSEST LÖSUNG: Ich habe eine abgeleitete Controller-Klasse erstellt, die nach Ansicht Modell Auswahlliste Wörterbuch (IDictionary<string, SelectList>) in die Ansichtsdaten View(string viewName, string masterName, object model) und spritzt überschreibt:

protected override ViewResult View(string viewName, string masterName, object model) 
{ 
    var result = base.View(viewName, masterName, model); 
    if ((model is ViewModelBase) && (!ViewData.ContainsKey(SelectListsViewDataKey))) 
    { 
     var vm = (ViewModelBase)model; 
     result.ViewData.Add(SelectListsViewDataKey, vm.GetSelectLists()); 
    } 
    return result; 
} 

Antwort

2

Sie konnten die Eltern Metadaten erhalten, aber ich glauben Sie nicht, dass Sie die Elternmodellinstanz erhalten können:

@{ 
    var parentType = ViewData.ModelMetadata.ContainerType; 
    var metadata = ModelMetadataProviders.Current.GetMetadataForType(null, parentType); 
} 
+0

Ja, ich denke, die beste mögliche Lösung ist es, einen Verweis auf die entsprechende 'SelectList' in einem mehr com Plex-Typ, der den Fremdschlüssel im Ansichtsmodell darstellt. Bis dahin habe ich den Workaround in meiner obigen Bearbeitung implementiert. – ProfK

Verwandte Themen