1

以下代码取自教程:http ://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/examineing-the-edit-methods-and-edit-view显示如何使用 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

您只需在视图中插入一个文本框即可获取价格值。然后在操作中接收此值并修改查询以获得所需的结果。

像这样:

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

在 action 方法中,您使用下面的代码用流派值填充下拉列表。您不必为价格价值做同样的事情。

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 回答
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 回答