关于c#:Razor视图引擎 – 如何添加部分视图

Razor view engine - How can I add Partial Views

我想知道,如果可能的话,使用新的Razor视图引擎呈现局部效果的最佳方法是什么。我知道这件事到那时还没有完全完成

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

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

调用renderpage的页面使用一个布局(master)页面,其中定义了三个部分:titleContent、headcontent和mainContent。当我试图从这个页面呈现我的区域设置控件时,这些部分似乎也是必需的——它们应该只在调用页面中是必需的,并且存在。无论部分视图中是否包含这些部分,我都会收到以下消息(显然,我不想包含这些部分,但它似乎是一个有趣的调试点…)。

The following sections have been
defined but have not been rendered on
the layout page
'~/Views/Shared/LocaleUserControl.cshtml':
TitleContent; HeadContent; MainContent

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@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);
                });
            });
        });
    });


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

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

或者,如果情况并非如此,那么简单地说:

1
@Html.Partial("nameOfPartial", Model)


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

1
2
3
4
5
public class GameViewModel
{
    public virtual Ship Ship { get; set; }
    public virtual GamePlayer GamePlayer { get; set; }    
}

然后,在控制器中,只需对各个模型运行查询,将它们传递给视图模型并返回它,例如:

1
2
3
GameViewModel PlayerStats = new GameViewModel();

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

[检查结果的代码]

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

如我所说,只有当您想显示相关表的统计信息时,才应该这样做,而且由于安全原因,没有其他人提到过CRUD过程的其他部分发生。