2013-03-21 51 views
1

以下代碼摘自本教程:http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/examining-the-edit-methods-and-edit-view,其中顯示瞭如何使用ASP.net MVC 3來管理電影數據庫。在控制器類中重複使用代碼

在tutoral中,列表對象被添加到包含數據庫中存在的每個電影類型的控制器類。然後將該列表傳遞給視圖中的下拉菜單,從而使數據庫能夠按流派搜索。

控制器:(粗體有關電影類型的代碼)

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

} 
+0

您需要下拉列表中的價格嗎? – Sharun 2013-03-21 12:23:44

+0

你真的需要下拉列表中的價格作爲流派嗎? – Sharun 2013-03-21 13:47:21

+0

不是。這更多的是關於重用代碼的理論問題。我只是以教程爲例。 – user1405195 2013-03-21 14:32:27

回答

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

而且在行動方法,則需要使用下面的代碼來填充類型值的下拉列表。您不需要爲價格價值做同樣的事情。

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

} 
+0

謝謝Slacker。也許我的問題不是很清楚。我想避免的是在movieGenre和price兩個操作方法中重複代碼。所以我認爲我需要創建一個單獨的類來存儲代碼,並從movieGenre和price的action方法中調用它。 – user1405195 2013-03-21 12:45:35

+0

我還不能理解你的問題。你不想同時搜索兩個標準嗎? – Sharun 2013-03-21 13:16:00

+0

我已更新我的問題。希望更清楚。非常感謝。 – user1405195 2013-03-21 13:33:16

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 
    } 
} 
+0

答案對你有幫助嗎?如果是,請接受爲答案,或讓我知道,這樣我可以幫助你更好。 – Aidin 2013-03-25 16:26:17