【问题标题】:ASP.NET MVC Is it possible to use ascx files across multiple views with different ModelsASP.NET MVC 是否可以在具有不同模型的多个视图中使用 ascx 文件
【发布时间】:2011-01-05 15:54:03
【问题描述】:

我想知道是否可以包装一个 ascx 文件,以便它可以在不同的视图中使用,而不必将其键入到特定的模型中。

这意味着您可以将一个 ascx 文件用于多个页面,只要传入相关的模型数据。

目前我正在为网站的不同部分复制我的 ascx 文件,但这感觉非常不干燥。

ps 这是我传入的第一种模型。

public class DinnerPage {
public Dinner dinner {get; set;} //main page data
public List<Dinner> Random6Dinners {get; set;} // ascx content
}

问题是,如果我想使用呈现 6 个随机晚餐的 ascx 文件,但对于不同的主页,则必须以不同的方式键入。

基本上,你能有一个无类型的 ascx 页面(或视图)

谢谢大家。

【问题讨论】:

    标签: asp.net-mvc model-view-controller model


    【解决方案1】:

    我相信您要问的是您是否可以重用多个视图,例如单个视图上的控件?如果是这样,你确实可以。在您的视图中使用 Html.RenderPartial 操作。这将在您当前的视图上呈现一个现有的“aspx”页面:

    示例:

    假设 Model.Dinners 是某种 List/Enumrable。

    Dinners.aspx

    <!--html-->
    
    <%foreach(var dinner in Model.Dinners){%>
     <% Html.RenderPartial("~/DinnersFolder/Dinner.ascx", new { Dinner = dinner}); %>
    <%}%>
    
    <!--html-->
    

    Dinner.aspx

     <%
      var dinner = ViewData.Eval("Dinner");
     %>
     <!--html-->
    

    这样的东西适合单独的晚餐:

     <% Html.RenderPartial("Dinner", Model.Dinner); %> //Dinner being Dinner.ascx
    

    这样您的 ("MyPartialView" / MyPartialView.aspx) 将接受一种类型的晚餐。然后,您可以通过 ViewData.Eval 提取该晚餐,并相应地显示您的“晚餐”。

    在您的主页中,您可以:然后在我的晚餐中执行类似 foreach Dinner 之类的操作,渲染一个 PartialControl。

    一个详细的例子:

    您也可以使用 RenderAction,这具有完全相同的想法。但是,它会发布到您的 Controllers 操作,该操作又会返回一个视图:

    <% Html.RenderAction(...); %> 
    

    这是一篇很棒的文章,介绍了两者之间的区别,您应该使用它:

    【讨论】:

    • 现在还没有时间测试这个,但是你可以将这样的模型从主视图传递到 ascx 是非常有意义的。会让你知道我的进展情况。
    【解决方案2】:

    您是否尝试过一个基本的晚餐模型,其中 6 个随机晚餐类派生自,然后只使用用户控件:

    <%= Html.RenderPartial("DinnerControl", 
                           Model.RandomDinnerThatDerivesFromBaseDinner); %> 
    

    然后你的控件的第一行应该是这样的:

    <%@ Control Language="C#" 
        Inherits="System.Web.Mvc.ViewUserControl<BaseDinner>" %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多