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控制器操作完全相同:

  • 查询DAL以获取域模型
  • 将域模型映射到视图模型
  • 将视图模型传递给视图
  • 进一步的改进是从视图模型中去掉
    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 );