【问题标题】:MVC PartialView in multiple Views with different models具有不同模型的多个视图中的 MVC PartialView
【发布时间】:2017-03-12 14:04:01
【问题描述】:

这可能是一个愚蠢的问题,更多的是关于如何做某事的问题,而不是实际的编码问题。

我想要一个包含搜索表单和搜索结果并使用模型Suppliers 的局部视图。

然后,此部分视图将在使用不同模型的多个视图中呈现。

我是否可以这样做,或者我必须在每个视图中创建搜索表单或为每个视图创建一个局部视图,以便视图和局部视图使用相同的模型?

如果我将Suppliers 模型用于局部视图,而将另一个模型用于视图,我只会得到错误:

传入字典的模型项的类型为“x”,但此字典需要类型为“y”的模型项。

【问题讨论】:

  • 每个视图都会从内部调用局部视图,因此每个视图都需要以某种方式访问​​Suppliers 模型。您可能想尝试拥有一个带有Suppliers 列表的抽象基类,并让您的视图模型继承自它,或者让它们实现一个具有Suppliers 列表的接口。当我需要在多个视图中拥有一个过滤器模型时,我选择了第二个选项。

标签: c# asp.net-mvc


【解决方案1】:

您绝对可以通过不同的实现来做到这一点。

第一个选项:

您可以从您拥有的“共享”视图中删除模型,并让它与您从控制器传递给视图的 ViewBag 或 ViewData 一起使用。显然,您需要在将返回此共享局部视图的所有控制器操作中填充此视图包或视图数据。

第二个选项:

除了将供应商作为共享视图的视图模型之外,您还可以在视图模型“供应商”中拥有另一个您可以使用的属性,但是当您渲染共享视图时,您需要指定该属性并传递它作为共享视图的模型,例如:

Html.RenderPartial("MySharedView", Model.SharedViewModel);

现在您必须对呈现此共享的所有其他视图执行相同的操作,并且基本上将此“SharedViewModel”作为这些视图模型中的属性并将Model.SharedViewModel 传递给共享视图。

当然,一旦您对 MVC 中的共享视图更加熟悉,您还可以找到其他选项。

【讨论】:

  • RenderPartial 是答案,所以我可以指定模型,尽管我必须这样做:@{Html.RenderPartial("PathToSharedView", new SharedViewModel());}
【解决方案2】:

【讨论】:

    【解决方案3】:

    因此,每个局部视图都将直接与模型相关联。如果您希望在同一视图中获得来自不同模型的不同信息,那么最好的选择是模态的概念。就在同一视图上一起呈现搜索和搜索结果部分视图而言。确保你在说明你在哪里使用模型(即@model [model name here]@model IEnumberable<[model name here]> 如果你正在枚举你的结果,就像显示来自数据库的搜索结果列表一样;尝试使用一个单独的视图模型。这将允许您单独更改与特定表/列交互的方式(即,如果您通过它们进行枚举)

    【讨论】:

      【解决方案4】:

      首先,您需要在名为_SearchBox.schtml 的共享文件夹下创建局部视图。可以是这样的:

      @model IEnumerable<your.project.Supplies>
      <div id="search-box">
       @using (Html.BeginForm("MakeSearch", "SearchController", FormMethod.Get))
           {
          <input type="search" name="search" />
          <input type="submit"  value="GO" />
      }
      </div>
      

      然后你可以通过调用从任何视图调用它

       @{Html.RenderPartial("_SearchBox", listOfSupplies);}
      

      否则,如果您希望从 DB 获取耗材并且您的父视图上没有耗材列表,您可以在控制器中创建操作。

       [ChildActionOnlyAttribute]
              public ActionResult _SearchBox()
              {           
                  var supplies= _service.GetSupplies();  
                   PartialView(supplies);            
              }
      

      并从视图中调用它:

       @{ Html.RenderAction("_SearchBox", "Search"); }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-11
        • 2020-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多