传递数据给所有页面的布局

7 浏览
0 Comments

传递数据给所有页面的布局

我有一个网站,其中有一个布局页面。然而,这个布局页面包含了所有页面模型必须提供的数据,例如页面标题、页面名称以及我们实际所在的位置,以供一个执行某些操作的HTML助手使用。此外,每个页面都有自己的视图模型属性。

我该如何做到这一点?似乎直接在布局中输入这些信息是个不好的主意,但是我该如何传递这些信息呢?

0
0 Comments

问题出现的原因:

开发人员需要将一些数据传递给所有页面的布局,以便在布局中使用这些数据。然而,他们面临着如何传递这些数据的问题。

解决方法:

一种解决方法是创建一个独立的LayoutModel类,其中包含布局中所需的所有属性,然后将该类的实例存储在ViewBag中。可以使用Controller.OnActionExecuting方法来填充它。然后,在布局的开始处,可以从ViewBag中获取此对象,并继续访问该强类型对象。

这种方法的好处是不需要改变现有项目中所有模型继承自单个“超级”模型的结构。如果从头开始,可以选择将所有模型派生自共同的根模型。

使用ViewBag的另一个好处是,您的操作不必始终具有视图模型。此外,必须知道必须始终从基类继承视图模型的开发人员是一个缺点。

这种解决方法也有一些争议。有人认为,如果已经有一个包含所有布局所需属性的类,为什么要将它添加到ViewBag中,然后再进行强制类型转换呢?可以在布局视图中使用模型,仍然可以在OnActionExecuting中填充模型。使用ViewBag还意味着您在控制器中丢失了类型安全性,这是一件不好的事情。

还有人认为,继承模型会将您限制为在BlogController中的所有操作中具有相同的布局。如果客户要求在索引页面使用带有大型标志和额外文本的布局,而在详细页面使用小型布局,那么继承模型将无法满足这个需求。在这种情况下,只需将控制器从Controller更改为BaseController,即使您有100个控制器,也只需要几分钟。

将数据传递给所有页面的布局是一个常见的问题。使用ViewBag存储一个独立的LayoutModel类的实例是一种解决方法。这种方法允许在布局中访问强类型的对象。此解决方法的好处是不需要改变现有项目中所有模型继承自单个“超级”模型的结构。但是,也有人认为在布局视图中使用模型并在OnActionExecuting中填充模型是更好的解决方法,因为使用ViewBag会导致在控制器中失去类型安全性。此外,继承模型可能会限制您在不同控制器中使用不同布局的能力。

0
0 Comments

问题描述:

问题是如何将数据传递给所有页面的布局(layout)。

问题原因:

根据给定的内容,问题的原因是需要在所有页面的布局中传递数据。在代码中,使用了RenderAction HTML助手来呈现局部视图。如果只需要简单的字符串,可以直接返回字符串并在视图中进行简单地写入。但如果需要复杂的数据,则可以返回PartialViewResult和模型。

解决方法:

解决方法是在控制器的Action方法中返回PartialViewResult,并将模型传递给局部视图。在局部视图中,在创建的'_maPartialView.cshtml'文件的开头放置模型。然后可以在局部视图中使用模型中的数据来进行HTML操作。

结论:

根据给定的内容,问题的解决方法是使用RenderAction HTML助手来呈现局部视图,并在控制器的Action方法中返回PartialViewResult和模型。这种方法可以将数据传递给所有页面的布局。

0
0 Comments

Pass data to layout that are common to all pages是一个常见的需求,它的出现原因是为了避免在多个地方重复编写相同的代码。为了解决这个问题,我们可以创建一个基础的视图模型(base viewmodel),供所有视图模型(view models)继承使用。然后,布局页面(layout page)可以使用这个基础模型。如果这些数据需要一些逻辑处理,我们可以将逻辑放入一个基础控制器(base controller),供所有控制器(controllers)继承使用。

下面是一个简单的示例,来演示这个概念。首先,创建一个所有视图模型都会继承的基础视图模型(ViewModelBase):

public abstract class ViewModelBase
{
    public string Name { get; set; }
}
public class HomeViewModel : ViewModelBase
{
}

布局页面可以使用这个基础视图模型作为模型(model):

@model ViewModelBase


    
        
        Test
    
    
        
Hello @Model.Name
@RenderBody()

最后,在控制器的动作方法中设置数据:

public class HomeController
{
    public ActionResult Index()
    {
        return this.View(new HomeViewModel { Name = "Bacon" });
    }
}

以上就是解决这个问题的一种方法。如果有些视图(views)没有视图模型,这种方法就不适用了。此外,如果要向ViewModelBase添加其他属性,就需要在每个控制器和每个动作方法中添加相应的代码。为了避免这种重复的代码,可以将公共的代码放入一个基础控制器(base controller)中,然后所有的控制器都继承于这个基础控制器。这样一来,公共的代码只需要编写一次,就可以应用到所有的控制器中。

总结起来,Pass data to layout that are common to all pages的问题可以通过创建一个基础视图模型和一个基础控制器来解决。基础视图模型用于向布局页面传递数据,基础控制器用于处理共同的逻辑并供所有控制器继承使用。这样就能避免在多个地方重复编写相同的代码。

0