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