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パターンは正しく使用されています...ASP.NETMVCはUIレイヤーであるため、不足しているのは他の2つのレイヤー(BusinessLayerとDataAccessLayer)です。

コメントによる更新:

OKを使用var userroletypes = db.UserRoleTypes.Where(u=> u.UserRoleType != 1); すると、クエリを満たすUserRoleTypeのリストが返されます。

次に、userroletypesコレクションを使用して新しいSelectListオブジェクトを作成し、対応するviewmodelプロパティに割り当てます。次に、そのViewModelをビューに渡します。

ところで、私はこれまでこのdb.XXXX.Select()メソッドを使用したことがなく、それが何をするのかよくわかりません...私は常にWhere句を使用します。

2番目の更新: DropDownListは、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<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 に答える