【问题标题】:ASP.NET MVC - RenderPartial with dynamic modelASP.NET MVC - 具有动态模型的 RenderPartial
【发布时间】:2012-06-27 22:34:04
【问题描述】:

我们有一个包含Widget<dynamic> 集合的 ViewModel:

public class Widget<T>
{
    public string ViewName { get; set; }
    public T Data { get; set; }
}

在我们的视图中,我们遍历小部件集合并调用Html.Partial

@foreach (var widget in Model) {
    @Html.Partial(widget.ViewName, widget)
}

如果该部分具有动态模型或Widget&lt;dynamic&gt; 模型,则此方法提供

但是,我希望在局部视图中使用智能感知,因此我为我的视图提供了适当的小部件数据类型的模型,例如:

@model Widget<string>

不幸的是,这会引发异常,因为 @Html.Partial 将动态模型转换为 System.Object。

除了在局部中再次手动转换小部件之外,有没有办法在不将动态模型转换为对象的情况下调用Html.Partial

【问题讨论】:

  • 如果您知道Tstring,为什么还要使用dynamic
  • 我们不知道Tstring。主 ViewModel 包含一组小部件,可以是 Widget&lt;string&gt;Widget&lt;SomeModel&gt; 等。只有 Partial“知道”应该传递给它什么。
  • 如果你使用 T 则不需要动态。你的视图模型应该有一个 Widget 的集合,而不是 Widget
  • @Mark,我应该更明确一点 - 视图模型将包含 不同 类型的小部件。
  • @Ben 我想我现在看到了问题

标签: asp.net-mvc asp.net-mvc-3 dynamic


【解决方案1】:

创建一个接口,所有动态对象类型的小部件都必须实现该接口,我之前也是这样做的,并且工作顺利

带有渲染的简单示例:(这只是一个您必须完成的快速示例)

    public interface IWidget{

     public System.Web.Mvc.MvcHtmlString RenderMyWidget(HtmlHelper helper);

}




public class ContenidoWidgets : IWidget{

    private String Controller { get; set; }

    private String Action { get; set; }

    private Object Parms {get; set; }

    public ContenidoWidgets(String controller, String action, Object parms)
    {

        this.Controller = controller;
        this.Action = action;
        this.Parms = parms;

    }

    public System.Web.Mvc.MvcHtmlString RenderMyWidget(HtmlHelper helper){

        return System.Web.Mvc.Html.ChildActionExtensions.Action(helper, this.Action, this.Controller, this.Parms);

    }

视图....

@model IWidget

@model.RenderMyWidget(this.html);

【讨论】:

  • 啊,所以您将呈现小部件的责任委托给小部件。我会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多