2013-02-01 204 views
3

我想重用一些代碼和部分視圖似乎是使用MVC時做到這一點的最佳方法。MVC部分視圖

我創建了一個從IEnumerable繼承的部分視圖(見下文)。

@model IEnumerable<Models.facility> 

<div class="display-field"> 
    @foreach (var facility in Model) 
    { 
     <li> 
      @facility.name 
     </li> 
    } 
</div> 

嵌入這種觀點做它像這樣的觀點:所以現在

<div class="display-field"> 
    <div> @{Html.RenderPartial("FacilityPartial");} </div> 
</div> 

問題。

我得到一個null引用錯誤,我可以看到Model變量爲null。

錯誤:

Object reference not set to an instance of an object.

誰能告訴我我是否做了正確的事情,我要去的地方比實際上它是空不對等?

+2

您是否在父視圖中實例化了模型的實例? – Simon

+0

不可以。我該怎麼做,在哪裏?如果我將多個@model添加到視圖的頂部,則會出現運行時錯誤:文件中只允許有一個「模型」語句。 – Yos

+0

@Joe有一個封裝所有模型對象的基礎模型,然後使用該模型 – DGibbs

回答

3

使用Html.Partial。考慮這個例子。

索引視圖(主頁)

@{ 
     ViewBag.Title = "Home Page"; 
     //Test model to be passed to the partial view 
     var products = new List<Product> { new Product{ProductName="Test product 1", ProductId=1234}}; 
    } 
@Html.Partial("_TestPV", products) 

_TestPV(部分圖)

@model IEnumerable<Product> 
<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      ProductName 
     </th> 
    </tr> 
@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.ProductName) 
     </td> 
    </tr> 
} 
</table> 

輸出:

enter image description here

+0

這樣現在運行時沒有錯誤,但是我希望我傳遞的模型只是一個包含數據庫表中所有記錄的模型爲此,即我的部分觀點是模仿在設施表上建模的設施模型。我如何通過我可以使用的東西來包含設施表中的所有記錄?然後,我可以簡單地遍歷該表的所有db記錄,並在我的視圖中顯示它。謝謝! – Yos

+0

從你的控制器調用db獲取設施列表,然後將它們存儲在ViewBag.Facilities中,然後將其作爲@ Html.Partial(「FacilityPartial」,ViewBag.Facilities as List ) –

+0

Yesssssssssss !!!非常感謝你。 – Yos

2

您忘記將參數傳遞給您的局部視圖,因此爲null引用。應該是:

@{Html.RenderPartial("FacilityPartial", someIEnumerableVariableHere);} 
+0

你錯了。如果使用Html.RenderPartial並傳遞模型參數,那麼將會出現編譯器錯誤,因爲這是一個void類型。 –

+0

呃..不,我不是。 [鏈接](http://i.imgur.com/WeinfNC.png) – Artless

0

當你調用@{Html.RenderPartial("FacilityPartial");}您所提供的局部視圖的名字,但你忘了,包括模型作爲參數。這就是爲什麼你得到空引用錯誤,因爲當視圖被渲染它正試圖訪問您的視圖宣佈模型:

@model IEnumerable<Models.facility> 

如果更改調用行@{Html.RenderPartial("FacilityPartial", model);}它應該管用。該視圖現在可以對正在傳入的模型起作用。


作爲一個側面說明,接受的答案被@Jobbert Enamno,使用@Html.Partial而不是你已經在你的問題中使用@Html.RenderPartial。這之間的區別可能混淆你或其他人觀看了這個問題:

@Html.Partial回報渲染視圖爲MvcHtmlString,所以如果你想你可以存儲在這個變量。

@Html.RenderPartial不返回任何東西,即空白,因此直接輸出到Response流。

性能方面,使用後者通常會更好。有關更詳細的解答,請參閱this問題。