我可以使用什么技术使模型与MVC中呈现的部分视图相关联?
本文关键字:视图 关联 什么 可以使 技术 MVC 模型 我可以 | 更新日期: 2023-09-27 18:04:22
我正在动态构建一个搜索屏幕,它出现了一个我不确定如何解决的问题。
为简单起见,假设我有3个实体类型:一个人,一条狗和一辆车。它们在搜索表单上的下拉列表中列出,并且根据用户选择的内容,控制器返回具有特定于所选类型的搜索条件html控件的相关部分视图:
User selects 'Dog' from dropdown:
- Dynamically renders a pre-built partial view with search fields: Pet Name, Breed.
User selects 'Person' from dropdown:
- Dynamically renders a pre-built partial view with search fields: Name, Surname
等。
我有一个人,狗和车表在我的数据库,我需要搜索。我不知道如何:
1)将模型与相关的部分视图(包含实体特定的字段)关联
2)从控制器中检索模型并调用适当的数据库函数。
所以在我看来,我想这样做:
public ActionResult DoSearch()
{
switch ( theEntityTypeSelected )
{
case EntityType.Person :
{
var personModel someLogic.GetPersonPartialViewModel(); // The model containing the search criteria fields and values
var searchResults = db.Person.Where(x => x.Name == personModel.Name && x.Surname == personModel.Surname);
return View(searchResults);
}
}
}
我有什么选择来完成这个?也许还有比我上面列举的例子更好的方法?
下面是一个如何基于下拉菜单中选定的项动态渲染局部的例子。
public class SearchViewModel
{
public SearchViewModel()
{
this.SearchObjectTypes = new List<SelectListItem>();
}
public IList<SelectListItem> SearchObjectTypes { get; set; }
}
控制器 public ActionResult Partial()
{
var viewModel = new SearchViewModel();
viewModel.SearchObjectTypes.Add(new SelectListItem { Text = "Please select...", Value = "" });
viewModel.SearchObjectTypes.Add(new SelectListItem { Text = "Dog", Value = "Dog" });
viewModel.SearchObjectTypes.Add(new SelectListItem { Text = "Person", Value = "Person" });
return View(viewModel);
}
public ActionResult GetDogSearchView()
{
if (Request.IsAjaxRequest())
{
return PartialView("_DogSearch");
}
return View("_DogSearch");
}
主搜索视图
@model ModelBindingList.Controllers.SearchViewModel
@{
ViewBag.Title = "Partial";
}
@Html.DropDownList("SearchObjects", Model.SearchObjectTypes)
@using(Html.BeginForm())
{
<div id="SearchFields">
</div>
<input type="submit" value="Search"/>
}
@section scripts{
<script type="text/javascript">
$(function () {
$("#SearchObjects").change(function () {
var searchObjectType = $(this).find(":selected").text();
switch (searchObjectType) {
case "Dog":
$.get('@Url.Action("GetDogSearchView", "Home")', function (data) {
$('#SearchFields').html(data);
});
}
});
});
</script>
}
_DogSearch.cshtml
<input type="text" placeholder="Enter dog breed..."/>
当您从下拉菜单中选择一个项目时,将为部分视图发出一个GET
请求。但是,您将遇到的一个问题是如何将搜索字段传递回控制器。
由于您将允许用户搜索dog、person等,因此输入视图模型将需要声明所有字段(Name、Breed等)和正在搜索的对象类型(dog、person)。