2010-03-18 82 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