重用控制器类中的代码

时间:2013-03-21 11:58:30

标签: asp.net-mvc-3

以下代码摘自教程: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));
}

}

2 个答案:

答案 0 :(得分: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);

在您的操作方法中,您只需使用price的值来过滤数据

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

}

答案 1 :(得分: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
    }
}