我想知道如果可能的话,使用新的剃刀视图引擎渲染局部的最佳方法是什么。我知道这是当时还没有完全完成的事情
现在我正在使用 RenderPage 来呈现用户控件:
@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)
调用 RenderPage 的页面使用定义了三个部分的布局(主)页面:TitleContent、HeadContent 和 Maincontent。当我尝试从此页面呈现我的区域设置控件时,似乎这些部分也是必需的 - 它们应该只在调用页面中是必需的并且存在。无论我是否在部分视图中包含这些部分,我都会收到以下消息(显然我不想包含这些部分,但它似乎是一个有趣的调试点......)。
以下部分已定义但尚未在布局页面“~/Views/Shared/LocaleUserControl.cshtml”上呈现: TitleContent;头部内容;主要内容
我的部分观点如下(改编自以下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>
您的部分看起来很像编辑器模板,因此您可以将其包含在内(当然假设您的部分放在 ~/views/controllername/EditorTemplates
子文件夹中):
@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)
或者,如果情况并非如此简单:
@Html.Partial("nameOfPartial", Model)
如果您不想重复代码,并且像我一样只想显示统计信息,那么在您的视图模型中,您可以只传递您想要从中获取数据的模型,如下所示:
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 过程的其他部分。
Shared
文件夹中的_Layout.cshtml
文件并检查从WebViewPage
派生的_LogOnPartial.cshtml
的包含是如何完成的(使用 Html 。部分的)。所以不,部分不需要从ViewPage
或ViewUserControl
派生Html.Partial
即可工作。Html.RenderPartial
与 ASPX 页面一起使用,它返回 void。Html.Partial
返回一个MvcHtmlString
。因此,如果您的部分包含大量标记,那么您将创建一个可能非常大的字符串对象,仅用于立即对它进行 GC。是否有支持使用 Razor 直接渲染到输出的方法?@{...}
块中应该可行。不知道是否有更好的解决方案。