我想知道是否有办法为_layout.cshtml文件指定一个模型,我看到很多帖子的基本相同的问题与回复“替代”解决方案的人,不是说它不可能也不显示如何我们究竟能做到这一点
对webforms有一些经验我一直在尝试迁移到MVC并经常发现自己有这样的问题,我找到了这个网站:http://blog.bitdiff.com/2012/05/sharing-common-view-model-data-in.html 这部分解决了我的问题,但即使他们没有用_model绑定他们的_layout.cshtml,据我所知,如果我想访问SharedContext,我必须在每个视图上指定一个模型,如果我是的话请更正错
我想要做的是在_layout.cshtml上声明一个“@model Namespace.MyModel”,这样它就可以自己检索它的信息,而不必为从LayoutModel继承的每个视图实现一个模型
*我希望我很清楚,基本上,我想知道如何在_layout.cshtml上声明@model标签,以便它可以访问自己的模型
使用我之前链接的解决方案(即使它没有链接到我的问题)我必须这样做: @(((BaseController)ViewContext.Controller).Context.Property)获取共享信息,如果我可以简单地声明(并使用)@model,我可以通过做类似的事情来完成同样的事情:@Model。属性*
正如你所看到的,我正在努力将我已经知道的任何内容从webforms迁移到MVC,这对我来说很难,因为我必须采用与我习惯完全不同的某些做法
提前致谢
答案 0 :(得分:6)
您应该使用部分视图和RenderAction
将“需要模型”的布局部分委托给单独的控制器:
@Html.RenderAction("SomeAction", "LayoutController")
让LayoutController.SomeAction
返回PartialViewResult
,然后您可以强烈键入模型。
答案 1 :(得分:5)
即使您已经接受了答案,但根据您的说法,您只是提取图片网址,您应该使用JQuery,而不是模型。
此代码未经测试,为此道歉。如果我输入错误,请随时指出。包含背景图像的HTML元素具有id="url"
属性,因此选择器可以工作。
控制器
[HttpGet]
public string GetSessionUrl()
{
//logic to detmine url
return url;
}
JQuery的
$(document).ready(function () {
var $url = $('#url');
var options = {
url: "/Home/GetSessionUrl",
type: "get",
async:false
};
$.ajax(options).done(function (data) {
$url.attr('src', data);
});
});
答案 2 :(得分:4)
您可以将BaseModel
添加到_Layout。
@model BaseModel
然后所有模型都从该BaseModel类继承。
public class MyModel : BaseModel
{
}
正如其他人所说,这不是一个好习惯。 如果您的模型忘记继承BaseModel
,它会在运行时抛出异常。但是,这取决于您。
答案 3 :(得分:2)
在BaseController中,您可以将任何模型声明为属性。
public class BaseController : Controller
{
public BaseController ()
{
MyTag = new TagModel (); // or get db, take any value from there
}
public TagModel MyTag { get; set; }
}
行动中:
ViewBag.MyTag = MyTag ;
在_Layout.cshtml中,您可以使用
@{
var myTag = (TagModel)ViewBag.MyTag;
}