我可以使用什么技术使模型与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);
                }
        }
    }

我有什么选择来完成这个?也许还有比我上面列举的例子更好的方法?

我可以使用什么技术使模型与MVC中呈现的部分视图相关联?

下面是一个如何基于下拉菜单中选定的项动态渲染局部的例子。

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)。