【问题标题】:@model for _layout.cshtml on MVC4?@model 用于 MVC4 上的 _layout.cshtml?
【发布时间】:2013-07-25 21:11:05
【问题描述】:

我想知道是否有一种方法可以为 _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。属性*

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

提前致谢

【问题讨论】:

  • 为什么你的 _layout 需要一个模型?
  • 好的,在 _layout 中有一个模型不是一个好主意,您可以使用 ViewBag - 查看这个答案stackoverflow.com/questions/6267727/…
  • _layout 是您所有视图使用的部分。在那里指定模型会限制您网站上的每个视图也具有该模型。
  • 作为ViewBag 的替代方案,您还可以使用子操作。
  • @leandrokoiti - 您正在避免一种“不良做法”(ViewBag 的动态类型),但试图用另一种不良做法代替它(将您的布局与模型数据联系起来)。布局不应依赖数据...

标签: asp.net .net asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

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

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

LayoutController.SomeAction 返回一个PartialViewResult,然后您可以将其强输入到模型中。

【讨论】:

  • 谢谢 Ant P,我想这和 Jasen 评论的一样,所以我按照这个方向进行,我有一个子操作,它在 _layout 文件中呈现我需要的部分,所以我没有'不必将我的布局与模型联系起来,现在我有一个子操作,可以简单地在布局中呈现我需要的内容,我想这是最好的解决方案,非常感谢!
  • 不客气 - Jasen 的答案是可靠的;我没有通读所有的 cmets。
【解决方案2】:

即使您已经接受了答案,但根据您的说法,您只是在提取图像 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);
    });
});

【讨论】:

  • 嘿,James 再次感谢您抽出宝贵的时间,我切换到您的答案是因为您说模型特别不适合这项工作,而 Ant P 在更广泛的范围内解决了我的问题,我希望我可以选择这两个作为答案,因为它们都以两种不同的方式解决了我的问题,但是由于您专门解决了我想要实现的目标,因此我选择了您的答案,并且非常感谢您的帮助,该代码完成了工作,只需要添加( ) 在 JS 第一行的“function”之后 呵呵
【解决方案3】:

您可以将BaseModel 添加到_Layout。

@model BaseModel

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

public class MyModel : BaseModel
{
}

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

【讨论】:

  • 嘿,Win,非常感谢,因为我试图避免不良做法,所以我朝着 Jasen 和 Ant P 指出的方向前进,并创建了一个子动作来渲染我在 _layout 文件中需要的内容,非常感谢您的帮助!
【解决方案4】:

在 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;
}

【讨论】:

  • 嘿 Jhoon,虽然我真的很喜欢你的想法,但我还是按照 Ant P 和 Jasen 指出的方向决定创建一个子动作,不过非常感谢这个想法,我真的很感谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多