2010-03-18 46 views
1

如果MyControl.ascx是直接繼承System.Web.Mvc.ViewUserControl的控件,則從視圖中調用Html.RenderPartial("~/Views/Payments/MyControl.ascx");將起作用。使用Html.RenderPartial渲染派生的局部視圖

但是,如果控制繼承System.Web.Mvc.ViewUserControl派生新類,調用Html.RenderPartial("~/Views/Payments/MyDerivedControl.ascx");失敗,報告說,沒有這樣的觀點存在。

例衍生System.Web.Mvc.ViewUserControl

class MyDerivedControl : System.Web.Mvc.ViewUserControl 
{ 
    public Method() 
    { 
     ViewData["SomeData"] = "test"; 
    } 
} 

有一種解決方法,或者是有另一種方式我應該這樣做呢?也許是HTML幫手?

回答

0

從MVC的角度來看,讓視圖提供數據並不是一個好設計。通常這是控制器的責任。根據上下文以及此數據表示的內容,您可以使用HTML助手或寫入操作過濾器。這裏的自定義操作過濾器的例子:

public class SomeDataActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 
     filterContext.Controller.ViewData["SomeData"] = "test"; 
    } 
} 

然後裝飾用此過濾器的作用:

[SomeDataActionFilter] 
public ActionResult Index() 
{ 
    return View(); 
} 
+0

的觀點並沒有提供數據;我的問題是關於視圖將數據傳遞給**派生的**局部視圖以及在解釋之後嘗試顯示它時產生的錯誤(由派生的ViewUserControl類)。數據來自哪裏並不重要。 – 2010-03-20 10:57:10

+1

@FreshCode,我不知道爲什麼會發生這種特殊的異常。我只能告訴你,視圖不應該像你試圖在MVC應用程序中那樣繼承。視圖僅用於顯示來自控制器的數據。有一些技巧,如母版頁,部分視圖,HTML助手,允許您在視圖中編寫和重用功能。在由VS生成的默認ASP.NET MVC項目模板中,甚至沒有與'ascx'控件關聯的'.cs'文件。 – 2010-03-20 11:03:09