2016-12-06 97 views
1

这可能是一个愚蠢的问题,更多的是关于如何做某件事而不是实际编码问题的问题。不同模型的多视图MVC PartialView

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

然后这个局部视图将被渲染到使用不同模型的多个视图中。

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

如果我使用视图的Suppliers模型的局部视图和另一种模式我只是得到错误:

The model item passed into the dictionary is of type 'x', but this dictionary requires a model item of type 'y'.

+0

每个视图将调用局部视图从内侧,所以每个视图将需要以某种方式访问​​到'Suppliers'模型。你可能想尝试让一个抽象基类与一个'Suppliers'列表,并让你的视图模型继承它,或者让它们实现一个具有'Suppliers'列表的接口。当我需要在多个视图中使用过滤器模型时,我选择了第二个选项。 – Andrew

回答

1

你绝对可以做到这一点与不同的实现。

第一个选项:

您可以从“共享”的观点,你有,并将它与ViewBag或ViewData的,你传递给从控制器视图中工作放下模型。显然你需要在所有的控制器动作中填充这个视图包或者查看数据,这些动作将返回这个共享的局部视图。

第二选项:

而不必供应商为共享视图的视图模型,你可以在视图模型“供应商”,你可以使用其他属性,但是当你渲染共享查看您需要指定属性,并将其传递的模型,如共享视图:

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

现在你必须做同样的事情,为使这个共享的所有其他观点和基本都有这个“SharedViewModel”为在这些视图模型中的一个属性并通过Model.SharedViewModel共享视图。

当然,还有其他一些选择,您可以在MVC中的共享视图更舒适时找到它们。

+0

RenderPartial是答案,所以我可以指定模型,但我必须这样做:'@ {Html.RenderPartial(“PathToSharedView”,new SharedViewModel());}' – JBoom

0

因此,每个局部视图将直接绑定到模型。如果你想在同一视图中看到不同模型的不同信息,那么最好的办法就是模态的概念。就搜索和搜索结果而言,部分视图在同一视图上一起呈现。确保你正在说明你如何使用该模型(例如@model [model name here]@model IEnumberable<[model name here]>)如果您正在枚举结果,例如显示数据库中搜索结果列表的可能性;请尝试使用单独的视图模型。这将允许你改变你如何与单独的特定表/列进行交互(例如,如果你正在通过它们进行枚举)

0

首先,你需要在名称为_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"); }