0

我读过很多文章,他们说查询不应该放在控制器中,但我似乎看不出我还能把它放在哪里。

我当前的代码:

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);  
    }

风景:

<li>@Html.Label("User Role")@Html.DropDownListFor(x => Model.UserRoleType.UserRoleTypeID, Model.UserRoleTypes)</li>

如何保留视图模型和查询并排除不应显示的用户类型?

4

2 回答 2

1

我认为你做得很好。

无论如何...从控制器中删除查询逻辑所能做的就是拥有一个 ServiceLayer,您可以在其中进行查询并返回结果。

这里的 MVC 模式使用正确......您缺少的是其他 2 层(BusinessLayer 和 DataAccessLayer)......因为 ASP.NET MVC 是 UI 层。

更新,由于评论:

使用var userroletypes = db.UserRoleTypes.Where(u=> u.UserRoleType != 1); 就OK了,它会返回一个满足查询的UserRoleType列表。

然后,只需使用 userroletypes 集合创建一个新的 SelectList 对象...并将其分配给相应的 viewmodel 属性。然后将该 ViewModel 传递给 View。

顺便说一句,我以前从未使用过该db.XXXX.Select()方法,不确定它的作用......我总是使用Where子句。

第二次更新: 从作为 SelectItem 集合的 SelectList 加载 DropDownList。因此,您需要将查询结果的集合转换为 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 具有 type 的属性SelectList...但是您的属性是这样的public IEnumerable<SelectListItem> UserRoleTypes { get; set; },因此您可以更改它或调整我的答案。

于 2012-05-08T19:02:34.570 回答
0

除了这个实例之外,我认为您的代码没有任何问题db,我认为这是您在控制器中硬编码的一些具体 EF 上下文,因此无法单独进行单元测试。您的控制器操作与常见的 GET 控制器操作完全相同:

  1. 查询 DAL 以获取域模型
  2. 将域模型映射到视图模型
  3. 将视图模型传递给视图

进一步的改进是从您的视图模型中摆脱UserRoleType域模型类型,使其成为真正的视图模型:

public class AddUserViewModel 
{
    [DisplayName("User Role")]
    public string UserRoleTypeId { get; set; }

    public IEnumerable<SelectListItem> UserRoleTypes { get; set; }
}

接着:

public ActionResult AddUser()
{
    var model = new AddUserViewModel()
    {
        UserRoleTypes = db.UserRoleTypes.Select(userRoleType => new SelectListItem
        {
            Value = SqlFunctions.StringConvert((double)userRoleType.UserRoleTypeID).Trim(),
            Text = userRoleType.UserRoleTypeName
        })
    };
    return View(model);  
}

在视图中:

@model AddUserViewModel 
<li>
    @Html.LabelFor(x => x.UserRoleTypeId)
    @Html.DropDownListFor(x => x.UserRoleTypeId, Model.UserRoleTypes)
</li>
于 2012-05-08T18:59:25.207 回答