【问题标题】:ASP.NET Core 2.2 Master Layout Model IssueASP.NET Core 2.2 主布局模型问题
【发布时间】:2019-09-28 13:36:44
【问题描述】:

我在 ASP.NET Core 2.2 项目中有一个主布局,它使用模型(与其他视图一样)来创建整个网站的独特设计,我的每个视图都使用不同的模型,但它们都应该加载到单个布局文件中. 当我的布局需要一个模型时,如何将不同的模型传递给不同的视图?

我不想为每个视图组创建大量布局文件

用于可视化:

Product.cshtml(产品型号)==> _Layout.cshtml(产品型号)

Category.cshtml(类别模型)==> _Layout.cshtml(类别模型)

但是 _Layout.cshtml 只需要一个模型

【问题讨论】:

  • 视图及其布局可以拥有不同模型的唯一方法是,视图的模型是否是布局模型的后代。
  • 如何在 IActionResult 返回视图中传递 2 个不同的模型?

标签: asp.net-core razor model-view-controller layout model


【解决方案1】:

所以你想在 1 个视图中显示 2 个模型对吗?

您可以在这种情况下应用 MVVM 模式。

示例如下:

我将在 Model 文件夹中定义 3 个类

public class Post 
{
   public string Id {get;set;}
   public string Content {get;set;}
   public string UserId {get;set;}
}

public class Comment 
{
  public string Id {get;set;}
  public string Content {get;set;}
  public string PostId {get;set;}
}

// this will hold data for 2 class above
public class PostVM 
{
  public Post Post {get;set}
  public Comment Comment {get;set}
}

然后在我的控制器中,我将查询 db 以获取数据,以便像这样发布和评论

public IActionResult PostDetail(string postId)
{
  var post = _postRepository.GetPostById(postId);
  var comment = _commentRepository.GetCommentByPostId(postId);
  // MVVM model return to the view
  var vM = new PostVM 
  {
    Post = post,
    Comment = comment
  }
}

终于在我看来

@model PostVM

<div> @model.Post.Content </div>
@foreach(var comment in @model.Comment)
{
  <div> @comment.Content</div>
}

请根据您的代码进行相应调整。如果您有任何问题,请告诉我。

干杯

【讨论】:

  • 不,每个视图都需要自己的 ViewModel,但我的 Layout 需要一个特定的 ViewModel .. 如何返回 ViewModel 来同时提供 View 和 Layout?
【解决方案2】:

目前没有办法让_Layout.cshtml取两个不同的模型。

你能做的最好的就是创建一个基本模型,例如

   public class LayoutModel
   {
     public string LayoutFieldA { get; set; }
   }

然后您的页面模型可以继承基本模型,如下所示

   public class ProductModel : LayoutModel
   {
     public string ProductFieldA { get; set; }
   }


   public class CategoryModel : LayoutModel
   {
     public string CategoryFieldA { get; set; }
   }

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 2020-04-22
    • 2019-06-19
    • 2019-07-17
    • 2021-09-30
    • 1970-01-01
    • 2019-06-28
    • 2019-07-28
    • 2016-04-23
    相关资源
    最近更新 更多