2011-03-13 51 views
0

我想要做這樣的事情,其中​​產品在.aspx頁面的局部變量:綁定屬性在.NET MVC2所以LocalVariable

<p:ProgressBar runat="server" Progress="<%#item.Completed/item.Total%>" Width="100" /> 

綁定表達式沒有檢測到本地頁面級變量。有沒有辦法使用RenderPartial來完成這個而不是

+0

爲了詳細說明這一點,我真的不認爲像Width這樣的屬性應該放在模型中。這純粹是查看數據,只與視圖有關。似乎RenderPartial沒有方法在視圖本身上設置屬性。 – Brian 2011-03-13 19:35:59

回答

1

您不應該在ASP.NET MVC應用程序中使用任何服務器端控件(runat="server"),因爲它們依賴於ViewState和PostBack,它們是ASP.NET MVC中不再存在的概念。 webforms視圖引擎使用<asp:Content>面板實現母版頁唯一例外。也沒有約束的概念。

在ASP.NET MVC中,你有一個模型,一個控制器和一個視圖。控制器填充某個模型,並將其傳遞給要顯示的視圖。該視圖本身可以使用HTML helpers來生成簡單標記或包含用於更復雜場景的其他部分視圖。

所以,你開始定義模型:

public class MyViewModel 
{ 
    public double Progress { get; set; } 
} 

那麼你有一個控制器,它會操縱這個視圖模型:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var completed = 5; // get this from somewhere 
     var total = 10; // get this from somewhere 
     var model = new MyViewModel 
     { 
      Progress = (1.0 * completed/total) 
     } 
     return View(model); 
    } 
} 

,最後你將有一個強類型的視圖這一模式您可以在其中顯示標記:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<AppName.Models.MyViewModel>" 
%> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Progress</h2> 
    <div><%= Html.DisplayFor(x = x.Progress)</div> 
</asp:Content> 
+0

這並不完全回答我的問題。我知道我可以創建一個強類型控件並傳入模型,但我不想這樣做。這是額外的代碼,看起來不太好。我創建了一個帶有代碼的MVC控件,而不是附加模型,我只是想要一種將值填充到這些屬性的乾淨方式,無需傳遞新模型對象,這不是必需的。 – Brian 2011-03-13 19:20:01

+0

@rhooligan,這就是ASP.NET MVC應該如何工作。如果你不喜歡,你仍然有其他經典的ASP.NET WebForms,你可以在這裏使用服務器控件而沒有任何問題。我強烈建議你閱讀這裏的基本教程:http://asp.net/mvc並熟悉這個概念。並且要詳細說明一下關於Width屬性的評論,顯然這不應該成爲視圖模型的一部分:它應該在您的CSS文件中,然後您將爲包含進度條的div指定一個類。 – 2011-03-13 19:38:51

+0

良好的通話。我意識到我可以用CSS解決這種情況,但肯定有一種情況是我比ViewModel更適合在View代碼中處理。話雖如此,我認爲CSS解決方案不如我想要的那麼優雅和可讀。 – Brian 2011-03-13 20:01:54

0

答案是:確實存在這不是一個好方法。您可以使用ViewDataKey屬性傳入模型,但是您使用當前ViewDictionary中存在的鍵卡住,因此您要通過此路線添加一些cruft到父視圖。

如果您想要設置僅查看屬性,可以使用自定義HTML助手,但可能只是試圖找到一個工作,達林暗示的更好。