剃刀视图引擎-如何添加部分视图


84

我想知道,如果有可能,使用新的剃刀视图引擎渲染部分图像的最佳方法是什么。我了解到那时这还没有完全完成

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

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

调用RenderPage的页面使用布局(母版)页面,其中定义了三个部分:TitleContent,HeadContent和Maincontent。当我尝试从此页面呈现区域设置控件时,似乎也需要这些部分-仅应在调用页面中将其显示为必需。无论我是否在部分视图中包括这些部分,我都会收到以下消息(很明显,我不想包括这些部分,但这似乎是一个有趣的调试点...)。

以下部分已定义,但尚未在布局页面“〜/ Views / Shared / LocaleUserControl.cshtml”上呈现:TitleContent; HeadContent; 主要内容

我的局部视图如下(从以下链接改编):

@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>

Answers:


124

您的部分看起来很像一个编辑器模板,因此您可以这样包含它(当然,假设您的部分位于~/views/controllername/EditorTemplates子文件夹中):

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

或者如果不是这种情况,则简单地:

@Html.Partial("nameOfPartial", Model)

感谢您的反馈... Html.EditorFor在这种情况下可能是一个好主意-但我有兴趣看到替代方案,因为对于更复杂的示例而言并非如此-我肯定很快会再次遇到这种情况。Html.Partial将不起作用,因为它必须派生自ViewPage或ViewUserControl,而剃须刀Partial派生自WebViewPage ...
JP。

4
Html.Partial效果很好。使用Razor视图引擎在Visual Studio中启动一个新的ASP.NET MVC 3项目,打开_Layout.cshtml 文件Shared夹中的文件,并检查如何完成_LogOnPartial.cshtml其中的包含WebViewPage(使用Html.Partial)。所以不,部分不需要从ViewPageViewUserControl在所有的Html.Partial工作。
Darin Dimitrov

1
嗯,看来您是对的。看起来我还有一些调试工作要做。谢谢!
JP。

1
我曾经Html.RenderPartial与ASPX页面一起使用,该页面返回void。 Html.Partial返回MvcHtmlString。因此,如果您的partial包含大量标记,那么您将创建一个可能非常大的字符串对象,仅立即对其进行GC。有没有一种方法可以支持使用Razor直接渲染到输出?
德鲁·诺阿克斯

2
@Draw我认为将RenderPartial包装到一个@{...}块中应该可以工作。不知道是否有更好的解决方案。
CodesInChaos 2011年

0

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

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流程没有其他部分正在发生。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.