【问题标题】:Razor view engine - How can I add Partial ViewsRazor 视图引擎 - 如何添加部分视图
【发布时间】:2011-03-23 19:07:07
【问题描述】:

我想知道如果可能的话,使用新的 razor 视图引擎渲染局部的最佳方法是什么。我知道这是当时还没有完全完成的事情

现在我正在使用 RenderPage 来呈现用户控件:

@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)

调用 RenderPage 的页面使用定义了三个部分的布局(主)页面:TitleContent、HeadContent 和 Maincontent。当我尝试从此页面呈现我的语言环境控件时,似乎这些部分也是必需的 - 它们应该只在调用页面中是必需的并且存在。无论我是否在局部视图中包含这些部分,我都会收到以下消息(显然我不想包含这些部分,但它似乎是一个有趣的调试点......)。

以下部分已 已定义但尚未渲染 布局页面 '~/Views/Shared/LocaleUserControl.cshtml': 标题内容;头部内容;主要内容

我的部分观点如下(改编自以下link):

@inherits System.Web.Mvc.WebViewPage<LocaleBaseModel>
@using System.Web.UI;

<p>
     @Html.LabelFor(model => Model.CountryName)
    <br />
    @Html.DropDownListFor(model => Model.CountryName,null, string.Empty, new { @class = "text", accesskey="u"})
</p>
<p>
     @Html.LabelFor(model => Model.StateProvince)
    <br />
     @Html.DropDownListFor(model => Model.StateProvince, null, string.Empty, new { @class = "text", accesskey="t" })
</p>


<script type="text/javascript">
    $(function () {
        var countries = $("#CountryName");
        var statesprovinces = $("#StateProvince");
        countries.change(function () {
            statesprovinces.find('option').remove();
            var url = '@Url.Action("GetStatesProvinces", "Base")';
            $.getJSON(url, { countryId: countries.val() }, function (data) {
                $(data).each(function () {
                    $("<option value=" + this.ID + ">" + this.Name + "</option>").appendTo(statesprovinces);
                });
            });
        });
    });
</script>

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    如果您不想复制代码,并且像我一样只想显示统计信息,那么在您的视图模型中,您可以像这样传递您想要从中获取数据的模型:

    public class GameViewModel
    {
        public virtual Ship Ship { get; set; }
        public virtual GamePlayer GamePlayer { get; set; }     
    }
    

    然后,在您的控制器中,只需在相应模型上运行您的查询,将它们传递给视图模型并返回它,例如:

    GameViewModel PlayerStats = new GameViewModel();
    
    GamePlayer currentPlayer = (from c in db.GamePlayer [more queries]).FirstOrDefault();
    

    [检查结果的代码]

    //pass current player into custom view model
    PlayerStats.GamePlayer = currentPlayer;
    

    就像我说的那样,只有当您想显示相关表格中的统计数据时,您才应该真正这样做,并且出于安全原因其他人在上面提到的其他部分没有发生 CRUD 过程。

    【讨论】:

      【解决方案2】:

      您的部分看起来很像编辑器模板,因此您可以将其包含在内(当然假设您的部分放在~/views/controllername/EditorTemplates 子文件夹中):

      @Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)
      

      如果不是这样的话:

      @Html.Partial("nameOfPartial", Model)
      

      【讨论】:

      • 感谢您的反馈... Html.EditorFor 在这种情况下可能是一个好主意-但我有兴趣查看替代方案,因为对于更复杂的示例而言并非如此-我会肯定很快就会再次遇到这种情况。 Html.Partial 将不起作用,因为它必须从 ViewPage 或 ViewUserControl 派生,而剃刀部分派生自 WebViewPage...
      • Html.Partial 工作得很好。使用 Razor 视图引擎在 Visual Studio 中启动一个新的 ASP.NET MVC 3 项目,打开 Shared 文件夹中的 _Layout.cshtml 文件并检查从 WebViewPage 派生的 _LogOnPartial.cshtml 的包含是如何完成的(使用 Html 。部分的)。所以不,部分不需要从 ViewPageViewUserControl 派生Html.Partial 工作。
      • 嗯,看来你是对的。看起来我还有一些调试要做。谢谢!
      • 我曾经在 ASPX 页面中使用Html.RenderPartial,它返回 void。 Html.Partial 返回一个 MvcHtmlString。因此,如果您的部分包含大量标记,那么您将创建一个可能非常大的字符串对象,仅用于立即对它进行 GC。是否有支持使用 Razor 直接渲染到输出的方法?
      • @Draw 我认为将 RenderPartial 包装到 @{...} 块中应该可以。不知道是否有更好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      相关资源
      最近更新 更多