2014-04-25 12 views
18

Ich arbeite an einem MVC 5 Projekt, sehr neu für MVC. Ich habe bemerkt, diese Zeile im Code:MVC Großbuchstaben Modell vs Kleinbuchstaben Modell

@Html.DropDownListFor(model => model.ContractorId, Model.Contractors) 

die Richtlinie über die oben auf der Seite lautet:

@model Project.Models.ContractViewModel 

Die ContractViewModel Klasse hat einen Bauunternehmer in dem Objekt.

public IEnumerable<SelectListItem> Contractors 

Ich bin nur ein wenig verwirrt über die Hauptstadt M (Model.Contractors), hat Modell immer auf das im @model gebene Objekt beziehen? Was ist dann der Unterschied zwischen Model.Contractors und Model.Contractors?

+2

Die erste Zeile verwendet das Modell nur als Lambda-Ausdruck. '@ Html.DropDownListFor (m => m.ContractorId, Model.Contractors)' auch '@ Html.DropDownListFor (myself => mir.ContractorId, Model.Contractors)' sind auch korrekt. –

Antwort

32

Modell tatsächlich eine Instanz der Klasse darstellt, die Ihr Modell und Modell ist ein Alias ​​für Lambda-Ausdruck.

Wenn Sie @Model in Ihrer Ansicht schreiben Sie das Objekt von ContractViewModel verwenden, die von Controller-Aktion übergeben wird, wenn es nicht von View übergeben wird es Null sein kann und jede Eigenschaft des Modells Zugriff können Null Reference Exception werfen und schreiben Sie Model.Contractors Sie im Grunde bedeuten ContractViewModel.Contractors

und wenn Sie einen HTML-Helfer schreiben, müssen Sie einen Alias ​​dafür schreiben, es ist nicht zwingend zu schreiben model können Sie alles schreiben.

zum Beispiel:

@Html.DropDownListFor(m=> m.ContractorId, Model.Contractors) 

Es ist nur ein Alias ​​der Modell-Eigenschaften innerhalb Html Helper zuzugreifen.

Wenn Sie @model Project.Models.ContractViewModel an der Spitze der Ansicht schreiben, die eine andere Sache, in diesem Fall ist, dass wir das Modell der Ansicht definieren, dass es Project.Models.ContractViewModel Instanz Project.Models.ContractViewModel, tatsächlich unsere Sicht jetzt stark typisierte Instanz der Klasse nehmen.