2013-11-04 110 views
7

如果我有視圖和部分視圖,是否有任何方法可以將數據從部分視圖傳遞給父視圖?將數據從部分視圖傳遞到其父視圖

所以,如果我有View.cshtml

<div id="@someDataFromPartialSomehow"> 
    @Html.Partial("_PartialView") 
</div> 

而且_PartialView.cshtml

@{ someDataFromPartialSomehow = "some-data" } 

<div> 
    Some content 
</div> 

我怎麼會去實現這樣的事情?

我試過使用ViewBag.SomeDataFromPartialSomehow,但這只是導致父母中的null


嘗試

要嘗試圍繞數據的問題得到被稱爲我想在此之前產生:

View.cshtml

@{ var result = Html.Partial("_PartialView"); } 

<div id="@ViewData["Stuff"]"> 
    @result 
<div> 

_PartialView.cshtml

@{ ViewData["Stuff"] = "foo"; } 

<div> 
    Content 
</div> 

但是撥打@ViewDate["Stuff"]仍然沒有遺憾。

+2

你所說的「傳從數據指什麼部分查看父母「完全是? – bump

+0

那麼在我給出的例子中,想法是包裝div的ID是從部分視圖中設置的。 –

回答

19

您可以使用HttpContext在視圖之間共享狀態。

@{ 
    this.ViewContext.HttpContext.Items["Stuff"] = "some-data"; 
} 

然後:

@{ var result = Html.Partial("_PartialView"); } 

<div id="@this.ViewContext.HttpContext.Items["Stuff"]"> 
    @result 
<div> 

除非你已經顯示在你的問題的例子:

<div id="@someDataFromPartialSomehow"> 
    @Html.Partial("_PartialView") 
</div> 

您嘗試使用someDataFromPartialSomehow甚至調用局部視圖這顯然是不可能的。

還要記住,你試圖達到的是不好的設計。如果部分視圖只能在某個特定父級的上下文中工作,那麼您可能需要重新考慮對視圖的分離。不管在哪個環境下,部分視圖都必須是獨立的和可重用的。如果它假設有關託管父母的事情,那麼這裏有一個嚴重的設計問題。

+0

我在考慮更多元數據被傳遞給父母,父母可以使用它 - PartialView不會抱怨,如果該數據沒有被使用,所以它仍然是一般獨立和可重用 - 只需加入糖如果父母*可以*使用它。 很明顯,數據是在調用它的需求之後生成的,但這是問題的一部分! –

+0

請參閱我的更新,看看我的嘗試。 –

+0

看到我更新的答案。你可以使用HttpContext來共享數據。但再一次,請不要這樣做,這是一個非常糟糕的設計。有更好的方法來實現你的原始目標。 –

3

我有一個建議給你。

將隱藏的輸入字段放在部分視圖中,並從javascript中獲取它們。

例如:在_PartialView中。CSHTML

<input type="hidden" id="someDataFromPartialSomehow" value="5" /> 

在你看來

<script> 
$(document).ready(function(){ 
    var someDataFromPartialSomehow = $("#someDataFromPartialSomehow").val(); 
}); 
</script> 

請注意,您必須編寫文檔準備函數內部的js函數,因爲局部視圖應該是滿載。

View.cshtml

+0

謝謝,這是一個很好的解決辦法。理想情況下,我會尋找一個pure-asp.net的答案,但+1都是一樣的! –

0

因此在一些思考後,我本想出了

@{ 
    dynamic properties = new NullingExpandoObject(); 

    var result = Html.Partial("_PartialView", (NullingExpandoObject)properties); 
} 

<div id="@properties.Id"> 
    @result 
<div> 

_PartialView.cshtml

@{ Model.Id = "foo"; } 

<div> 
    Content 
</div> 

Where NullingExpandoObject is Jon Skeet's nullable dynamic dictionary

相關問題