1

次のコードは、チュートリアルから取得したものです ASP.net MVC 3 を使用して映画データベースを管理する方法。

チュートリアルでは、データベースに存在するすべての映画ジャンルを含むコントローラー クラスにリスト オブジェクトが追加されます。このリストはビューのドロップダウンに渡され、データベースをジャンル別に検索できるようになります。

コントローラー: (映画のジャンルに関連する太字のコード)

public ActionResult SearchIndex(string movieGenre, string searchString)
{
var GenreLst = new List<string>();

var GenreQry = from d in db.Movies
               orderby d.Genre
               select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreLst);

var movies = from m in db.Movies
             select m;

if (!String.IsNullOrEmpty(searchString))
{
    movies = movies.Where(s => s.Title.Contains(searchString));
}

if (string.IsNullOrEmpty(movieGenre))
    return View(movies);
else
{
    return View(movies.Where(x => x.Genre == movieGenre));
}

}

私がやりたいのは、これをさらに拡張して、ジャンルだけでなく価格でも映画を検索できるようにすることです。これを行うために、同じコードの多くを再利用できることを知っています。コントローラ クラスがジャンルまたは価格のいずれかを渡すことができる新しいクラスを作成する必要があると思います。これは正しいです?もしそうなら、私は例をいただければ幸いです。ありがとう。

更新/説明:

以下のように、ジャンルと価格の両方のコードを繰り返さないようにしたい:

public ActionResult SearchIndex(string movieGenre, string searchString,float moviePrice)
{
var GenreLst = new List<string>();

var GenreQry = from d in db.Movies
               orderby d.Genre
               select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreLst);

var PriceLst = new List<string>();

var PriceQry = from d in db.Movies
               orderby d.Genre
               select d.Genre;
PriceLst.AddRange(GenreQry.Distinct());
ViewBag.moviePrice = new SelectList(PriceLst);

var movies = from m in db.Movies
             select m;

if (!String.IsNullOrEmpty(searchString))
{
    movies = movies.Where(s => s.Title.Contains(searchString));
}

if (string.IsNullOrEmpty(movieGenre))
    return View(movies);
else
{
    return View(movies.Where(x => x.Genre == movieGenre));
}

if (string.IsNullOrEmpty(moviePrice))
    return View(movies);
else
{
    return View(movies.Where(x => x.Genre == moviePrice));
}

}
4

2 に答える 2

0

非常に多くの異なる方法でそれを行うことができますが、すべてが正しいですが、プロジェクトの複雑さに依存します. 基本的に、単純なプログラムを過度に設計する必要はありません。ただし、一般的には、すべてのロジックを別のクラスに移動し、アクションを使用して適切なロジック クラスを作成および呼び出す必要があります。

public class GetMoviesRequest
{
    public string Name { get; set; }
    public float? Price { get; set; } 
}

public class MoviesLogic
{
    private List<Movie> Movies;
    public IEnumerable<Movie> Get(GetMoviesRequest request)
    {
        IEnumerable<Movie> filtered = Movies.AsQueryable();
        if (!string.IsNullOrEmpty(request.Name))
        {
            //Filter by name
            filtered = filtered.Where(m => m.Name == request.Name);
        }
        if (request.Price.HasValue)
        {
            //Filter by value
            filtered = filtered.Where(m => m.Price == request.Price);
        }
        return filtered;
    }
}

public class MyController
{
    public ActionResult SearchIndex(string movieGenre, string searchString)
    {
        var logic = new MoviesLogic();
        var movies = logic.Get(new GetMoviesRequest() { Name = searchString } )
            ///do stuff with movies
    }
}
于 2013-03-21T15:08:02.647 に答える
0

価格値を取得するには、ビューにテキスト ボックスを挿入するだけです。次に、アクションでこの値を受け取り、クエリを変更して目的の結果を取得します。

このような:

  @Html.ActionLink("Create New", "Create")
    @using (Html.BeginForm()){   
         <p>Genre: @Html.DropDownList("movieGenre", "All")  
           Title: @Html.TextBox("SearchString")  
          Price: @Html.TextBox("Price")
         <input type="submit" value="Filter" /></p>
        }

また、アクション メソッドでは、以下のコードを使用して、ドロップダウン リストにジャンルの値を入力しています。price 値に対して同じことを行う必要はありません。

var GenreLst = new List<string>();

var GenreQry = from d in db.Movies
               orderby d.Genre
               select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreLst);

アクションメソッドでは、価格の値を使用してデータをフィルタリングするだけです

    public ActionResult SearchIndex(string movieGenre, string searchString,float price)
{
var GenreLst = new List<string>();

var GenreQry = from d in db.Movies
               orderby d.Genre
               select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreLst);

var movies = from m in db.Movies
             select m;

if (!String.IsNullOrEmpty(searchString))
{
    movies = movies.Where(s => s.Title.Contains(searchString));
}

if (string.IsNullOrEmpty(movieGenre))
    return View(movies);
else
{
    return View(movies.Where((x => x.Genre == movieGenre) &&(x => x.Price== price)));
}

}
于 2013-03-21T12:25:25.330 に答える