9

我想知道是否有办法为 _layout.cshtml 文件指定模型,我看到很多帖子都有基本相同的问题,人们用“替代”解决方案回复,不是说不可能,也不是展示我们如何能达到这个

对网络表单有一些经验我一直在尝试迁移到 MVC 并且经常发现自己有这样的问题,我找到了这个网站:http ://blog.bitdiff.com/2012/05/sharing-common-view-model -data-in.html 部分解决了我的问题,但即使他们也没有将他们的 _layout.cshtml 与@model 绑定,据我所知,如果我想访问 SharedContext,我必须在每个视图上指定一个模型,如果我错了,请纠正

我想做的是在 _layout.cshtml 上声明一个“@model Namespace.MyModel”,这样它就可以自行检索其信息,而不必为从 LayoutModel 继承的每个视图实现一个模型

*我希望我很清楚,基本上,我想知道如何在 _layout.cshtml 上声明 @model 标记,以便它可以访问自己的模型

使用我之前链接的解决方案(即使它没有链接到我的问题)我必须这样做:@(((BaseController)ViewContext.Controller).Context.Property) 来获取共享信息,如果我可以简单地声明(和使用)@model 代替,我可以通过执行以下操作来完成相同的事情:@Model.Property*

正如你所看到的,我正在努力将我已经知道的东西从 webforms 迁移到 MVC,这对我来说非常困难,因为我必须采用与我习惯的完全不同的某些做法

提前致谢

4

4 回答 4

8

您应该使用部分视图将“需要模型”的布局部分委托给单独的控制器,并且RenderAction

@Html.RenderAction("SomeAction", "LayoutController")

LayoutController.SomeActionreturn a PartialViewResult,然后您可以将其强输入到模型中。

于 2013-07-26T06:59:06.467 回答
5

即使您已经接受了答案,但根据您的说法,您只是在提取图像 URL,您应该使用 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);
    });
});
于 2013-07-26T13:11:31.100 回答
4

您可以添加BaseModel到_Layout。

@model BaseModel

然后所有模型都从该 BaseModel 类继承。

public class MyModel : BaseModel
{
}

正如其他人所说,这不是一个好习惯。如果你的模型忘记继承 from BaseModel,它会在运行时抛出异常。但是,这取决于您。

于 2013-07-25T22:42:54.397 回答
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;
}
于 2013-07-26T06:42:08.207 回答