这可能是一个愚蠢的问题,更多的是关于如何做某事而不是实际的编码问题。
我想要一个包含搜索表单和搜索结果的部分视图,并使用模型Suppliers
。
然后,该局部视图将在使用不同模型的多个视图中呈现。
我可以这样做,还是必须在每个视图中创建搜索表单,或者为每个视图创建一个局部视图,以便视图和局部视图使用相同的模型?
如果我将Suppliers
模型用于局部视图而另一个模型用于视图,我只会收到错误:
传递到字典中的模型项的类型为“x”,但此字典需要类型为“y”的模型项。
答案 0 :(得分:1)
你可以通过不同的实现来做到这一点。
第一个选项:
您可以从“共享”视图中删除模型,并使其与从控制器传递给视图的ViewBag或ViewData一起使用。显然,您需要填充此视图包或查看将返回此共享局部视图的所有控制器操作中的数据。
第二个选项:
您可以在视图模型“供应商”中使用另一个属性,而不是将供应商作为共享视图的视图模型,但在渲染共享视图时,您需要指定属性并传递它作为共享视图的模型,如:
Html.RenderPartial("MySharedView", Model.SharedViewModel);
现在你必须对渲染此共享的所有其他视图执行相同的操作,并且基本上将这个“SharedViewModel”作为这些视图模型中的属性并将Model.SharedViewModel
传递给共享视图。
肯定还有其他选项,一旦你对MVC中的共享视图更加熟悉,你就可以找到它。
答案 1 :(得分:0)
尝试使用部分操作而不是部分视图。
http://pratapreddypilaka.blogspot.co.uk/2011/11/htmlpartial-vs-htmlaction-mvc-razor.html?m=1
答案 2 :(得分:0)
因此每个局部视图都将直接与模型相关联。如果您希望在同一视图中获得不同模型的不同信息,那么您最好的选择就是模态的概念。在搜索和搜索结果部分视图在同一视图上一起渲染方面。确保您考虑的是说明您使用模型的方式(例如go install github.com/zpeters/speedtest
或@model [model name here]
如果您对结果进行了枚举,例如显示搜索结果列表的可能性。数据库;尝试使用单独的viewmodel。这将允许您单独更改与特定表/列交互的方式(即,如果您通过它们进行枚举)
答案 3 :(得分: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"); }