如何在局部视图中使用不同的模型(Frame inside @RenderBody())

本文关键字:模型 inside @RenderBody Frame 局部 视图 | 更新日期: 2023-09-27 17:53:33

我正在使用Razor(在MVC 3中)为一个facebook应用程序。
我的 _Layout。cshtml调用RenderBody(),它返回包含我们要求facebook用户提供的数据的主体。如果用户属于某个类别(例如,他是某个组的管理员),我允许他向应用程序发送信息,而普通用户只能查看信息。
为此,我在我的Index.cshtml:

@using samuraiscentraltrader.Models
@using Microsoft.AspNet.Mvc.Facebook.Models
@model MyAppUser
@{
    ViewBag.Title = "Home Page";
}
<article class="intro">
<span id="profilePicture">
    @if (Model.ProfilePicture != null && Model.ProfilePicture.Data != null)
    {
        <img src="@Model.ProfilePicture.Data.Url" />
    }
</span>
<h3>Welcome @Model.Name</h3>
@*<label>Email: @Model.Email</label>*@
@if(Model.Groups != null && Model.Groups.Data != null && Model.Groups.Data.Count > 0 &&
    Model.Groups.Data.Any(g=> g.ID=="xxxxxxxxxxxxxxx" && g.Administrator == "True"))
{
    <div>
        @Html.Partial("_Admin")
    </div>
}
else
{
    <p> blah blah blah.</p>
}
</article>

看到@Html.Partial("_Admin") ?这是正确的方法吗?

In my _Admin。cshtml,我有

@model samuraiscentraltrader.Hubs.TradeInfoHub
<fieldset>
    <legend>TradeInfoHub</legend>
    <div class="display-label">
        @Html.DisplayNameFor(model => model.msg)
    </div>
    <div class="display-field">
        @Html.DisplayFor(model => model.msg)
    </div>
</fieldset>
<p>
    @Html.ActionLink("Edit", "Edit", new { /* id=Model.PrimaryKey */ }) |
    @Html.ActionLink("Back to List", "Index")
</p>

我得到了以下异常:
<我>系统。InvalidOperationException:传入字典的模型项的类型为"samuraiscentraltrader.Models"。MyAppUser',但是这个字典需要一个类型为'samuraiscentraltrader.Hubs.TradeInfoHub'的模型项。

如何在局部视图中使用不同的模型(Frame inside @RenderBody())

周边声明其模型类型为@model MyAppUser,局部使用@model [...].TradeInfoHub。除非您提供不同的模型,否则该模型将向下传递到分部视图。这就是为什么你看到了例外。

由于视图需要TradeInfoHub,因此您需要提供它:

 @Html.Partial("_Admin", /*a TradeInfoHub instance*/)
或者,您可以调用像 这样的子操作
@Html.Action("ShowAdminContent", "AdminTools")
然后,

AdminToolsController.ShowAdminContent将呈现适当的内容。这样,原始视图就不需要知道"框架"的模型。如果我需要像这样组合页面,我更喜欢使用child-action方法。