Asp.net mvc 如何为下拉列表添加自定义查询并保留视图模型模式?
我读过很多文章,他们说不应该将查询放在控制器中,但我似乎看不出还有什么地方可以放置查询 我当前的代码:Asp.net mvc 如何为下拉列表添加自定义查询并保留视图模型模式?,asp.net-mvc,asp.net-mvc-3,razor,view-model-pattern,Asp.net Mvc,Asp.net Mvc 3,Razor,View Model Pattern,我读过很多文章,他们说不应该将查询放在控制器中,但我似乎看不出还有什么地方可以放置查询 我当前的代码: public class AddUserViewModel { public UserRoleType UserRoleType { get; set; } public IEnumerable<SelectListItem> UserRoleTypes { get; set; } } public ActionResult AddUser()
public class AddUserViewModel
{
public UserRoleType UserRoleType { get; set; }
public IEnumerable<SelectListItem> UserRoleTypes { get; set; }
}
public ActionResult AddUser()
{
AddUserViewModel model = new AddUserViewModel()
{
UserRoleTypes = db.UserRoleTypes.Select(userRoleType => new SelectListItem
{
Value = SqlFunctions.StringConvert((double)userRoleType.UserRoleTypeID).Trim(),
Text = userRoleType.UserRoleTypeName
})
};
return View(model);
}
公共类AddUserViewModel
{
public UserRoleType UserRoleType{get;set;}
公共IEnumerable用户角色类型{get;set;}
}
公共操作结果AddUser()
{
AddUserViewModel模型=新的AddUserViewModel()
{
userRoleType=db.UserRoleTypes.Select(userRoleType=>new SelectListItem
{
Value=SqlFunctions.StringConvert((双精度)userRoleType.UserRoleTypeID).Trim(),
Text=userRoleType.UserRoleTypeName
})
};
返回视图(模型);
}
观点:
<li>@Html.Label("User Role")@Html.DropDownListFor(x => Model.UserRoleType.UserRoleTypeID, Model.UserRoleTypes)</li>
@Html.Label(“用户角色”)@Html.DropDownListFor(x=>Model.UserRoleType.UserRoleTypeID,Model.UserRoleTypes)
如何保留视图模型和查询并排除不应显示的用户类型?除了这个
db
实例之外,我看不出您的代码有任何错误,我认为它是一些具体的EF上下文,您在控制器中硬编码,无法单独进行单元测试。您的控制器操作与常见的GET控制器操作完全相同:
UserRoleType
域模型类型,使其成为真正的视图模型:
public class AddUserViewModel
{
[DisplayName("User Role")]
public string UserRoleTypeId { get; set; }
public IEnumerable<SelectListItem> UserRoleTypes { get; set; }
}
并且认为:
@model AddUserViewModel
<li>
@Html.LabelFor(x => x.UserRoleTypeId)
@Html.DropDownListFor(x => x.UserRoleTypeId, Model.UserRoleTypes)
</li>
@model AddUserViewModel
@LabelFor(x=>x.UserRoleTypeId)
@DropDownListFor(x=>x.UserRoleTypeId,Model.UserRoleTypes)
我认为你做得很好
无论如何。。。要从控制器中删除查询逻辑,您所能做的就是拥有一个ServiceLayer,在其中执行查询并返回结果
这里的MVC模式使用正确。。。您缺少的是其他两层(BusinessLayer和DataAccessLayer)。。。因为ASP.NET MVC是UI层
由于评论而更新:
使用var UserRoleType=db.UserRoleType.Where(u=>u.UserRoleType!=1)代码>
如果没有问题,它将返回满足查询的UserRoleType列表
然后,只需使用userroletypes集合创建一个新的SelectList对象。。。并将其指定给相应的viewmodel属性。然后将该视图模型传递给视图
顺便说一句,我以前从未使用过db.XXXX.Select()
方法,不太清楚它的作用。。。我总是使用Where
子句
第二次更新:
下拉列表是从SelectItems的集合SelectList加载的。
因此,您需要将查询的结果集合转换为SelectList对象
var userroletypes = new SelectList(db.UserRoleTypes.Where(u=> u.UserRoleType != 1), "idRoleType", "Name");
然后创建ViewModel
var addUserVM = new AddUserViewModel();
addUserVM.UserRoleTypes = userroletypes;
并将addUserVM
传递到您的视图:
return View(addUserVM );
注意:我假设您的ViewModel具有类型为SelectList
的属性。。。但是您的是public IEnumerable UserRoleTypes{get;set;}
,因此您可以更改它或修改我的答案。如何在其中添加自定义查询?我正在尝试向我的viewmodel中添加某种类型的linq查询,但我不确定如何在不破坏viewmodel的情况下执行该操作。我相信您误解了我的意思。我试图找出如何进行自定义查询并保持结构var model=db.Where(u=>u.UserRoleType!=1);//不确定我写的是否正确,但这是一个示例
db
只是我实体的声明<代码>学生日程安排db=新学生日程安排()代码>另外,我不确定你所说的“然后,使用userroletypes集合创建一个新的SelectList对象…并将其指定给相应的viewmodel属性。然后将该viewmodel传递给视图”是什么意思。我认为它代表“数据库”,是EntityFramework或类似内容中的上下文类。是的,这是我对自动生成的模型/dbcontext的数据库声明。希望现在更干净一点。您的角色类型多久会更改一次?在过去,我通过使用定制的HtmlHelper和创建自己的“UserRoleDropdownFor”方法解决了这个问题,该方法使用应用程序缓存来管理角色列表,并在内部使用内置的DropDownList for来允许选择角色。如果需要多选,还可以使用ListBoxFor helper并创建UserRoleMultiSelectFor helper。如果选项列表不经常更改,或者如果角色列表发生更改,您可以根据需要清除缓存,则这些方法最有效。下拉列表不会经常更改,我只是尝试保留视图模型结构。我已经读到不应该通过控制器进行查询,而是在ViewModels中进行查询,但我只是缺少了一些东西,或者我不知道应该做些什么来实现查询。
return View(addUserVM );