我正在使用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")
行?这是正确的方法吗?
在我的 _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>
我得到以下例外:
System.InvalidOperationException:传递到字典中的模型项的类型为'samuraiscentraltrader.Models.MyAppUser',但此字典需要类型为'samuraiscentraltrader.Hubs.TradeInfoHub'的模型项。
提前致谢。
答案 0 :(得分:0)
周围声明其模型类型为@model MyAppUser
,部分使用@model [...].TradeInfoHub
。除非您提供不同的模型,否则模型将沿局部视图传递。这就是你看到异常的原因。
由于视图需要TradeInfoHub,您需要提供它:
@Html.Partial("_Admin", /*a TradeInfoHub instance*/)
或者,您可以调用类似
的子操作@Html.Action("ShowAdminContent", "AdminTools")
然后 AdminToolsController.ShowAdminContent
将呈现适当的内容。这样原始视图不需要知道“框架”的模型。如果我需要编写这样的页面,我更喜欢儿童行动方法。