C# 如何将强类型模型和模型列表同时传递给视图

C# 如何将强类型模型和模型列表同时传递给视图,c#,asp.net,asp.net-mvc,visual-studio,razor,C#,Asp.net,Asp.net Mvc,Visual Studio,Razor,我的最终目标是将一个强类型模型从控制器同时传递到视图,以填充下拉菜单和基于搜索查询的模型列表。我将它传递给的视图是清晰的视图。目前在my HomeController.cs中,我有: public ActionResult Clear() { var states = GetAllStates(); var model = new ProjectClearanceApp.Models.Project(); model.States =

我的最终目标是将一个强类型模型从控制器同时传递到视图,以填充下拉菜单和基于搜索查询的模型列表。我将它传递给的视图是清晰的视图。目前在my HomeController.cs中,我有:

public ActionResult Clear()
    {
        var states = GetAllStates();

        var model = new ProjectClearanceApp.Models.Project();

        model.States = GetSelectListItems(states);

        return View(model);
    }

    private IEnumerable<string> GetAllStates()
    {
        return new List<string>
        {
            "AL",
             // ... (you get the point)
            "WY",
        };
    }

    private IEnumerable<SelectListItem> GetSelectListItems(IEnumerable<string> elements)
    {
        var selectList = new List<SelectListItem>();

        foreach (var element in elements)
        {
            selectList.Add(new SelectListItem
            {
                Value = element,
                Text = element
            });
        }

        return selectList;
    }
到控制器。如何将下拉选项列表和适合搜索的模型列表从控制器传递到视图,或者,如何在不同时从控制器传递这两个选项的情况下实现相同的效果?

模型是一个真正描述要绑定到视图的数据的术语,以及当您向/从视图发出请求时,模型绑定器将处理哪些数据。因为我不确定您是如何使用Index和Clear的,所以我将一般地把它们删掉。如果我没有抓住你问题的重点,请告诉我:

例如,如果您在传递视图时遇到问题,请将movieModel与列表selectedStates或任何其他值一起列出,这里有两种常见的方法

ViewModel方法-创建一个模型类,其中包含主模型以及视图中需要的任何其他属性、列表等。 例如:


在大多数情况下,我更喜欢使用ViewModel来添加我需要的所有内容。首先,ViewBag/ViewData需要一些强制转换,并且它依赖于神奇的字符串,因此如果您键入的intellisense有问题,Visual Studio不会让您知道。也就是说,两者都是可行的。

要实现您的最终目标,即通过模型列表,据我所知,viewmodel将是最佳解决方案

视图模型上的一些关键注意事项:

ViewModel类,它是视图和模型之间的桥梁。每个视图类都有一个对应的ViewModel类。ViewModel从模型中检索数据,并将其转换为视图所需的格式。如果模型中的基础数据发生更改,它会通知视图,并根据视图中的UI事件更新模型中的数据

ViewModel类确定用户操作是否需要修改模型中的数据,并在需要时对模型进行操作。例如,如果用户按下按钮来更新零件的库存数量,视图只会通知ViewModel发生了此事件。ViewModel从视图中检索新的库存量并更新模型。这将使视图与模型分离,并将业务逻辑整合到ViewModel和可以测试它的模型中

官方定义/来源:

有关Ex的其他信息:

请告诉我您的想法或反馈

谢谢


Karthik

通过另一个将它们封装在一起的模型,从来没有任何理由从x中y选择x。SLaks这是一个很好的观点。如何在选择时重写select语句进行搜索,而不是从数据库中获取完整的电影列表,然后进行搜索?@B.Fitzgerald var movies=db.movies.asqueryable@菲茨杰拉德你什么都不需要做。在枚举之前,访问db.Movies不会加载任何内容。
public ActionResult Index(string searchString)
{
    var movies = from m in db.Movies
                 select m;

    if (!String.IsNullOrEmpty(searchString))
    {
        movies = movies.Where(s => s.Title.Contains(searchString));
    }

    return View(movies);
}
public Class MyViewModelClass
{
   List<Movie> MoviesList {get;set;}
   List<SelectListItem> StatesList {get;set;}
   //some other properties/methods can go here as well ...
}

//In Controller
{
    MyViewModelClass model = new MyViewModelClass();
    model.StatesList = <build your select list>;
    model.MovieList = <build your movie list>;

    return View(model);
}
//From Controller
public ActionResult SomeMethod()
{
   var states = GetAllStates();
   var model = <enter movies query here>;
   ViewBag.StatesList = GetSelectListItems(states);
   //This will be accessible in the view now

   return View(model);
}

//In View:
@{
    List<SelectListItem> StatesList =  (List<SelectListItem>)ViewBag.StatesList; // Can now use this variable to bind to DropDownList, etc.
 }