来自View和ajax的Route-map PartialView

时间:2015-10-23 08:13:09

标签: jquery asp.net asp.net-mvc routes asp.net-mvc-partialview

我是ASP.NET MVC的新手。 我刚刚创建了一个经典的MVCMovie应用程序。 现在,我想添加更多功能,仅供学习。 我按照流派搜索电影的"SearchByGen"视图:在视图中有一个类型的下拉列表和一个DIV占位符。占位符的内容由jQuery由PartialView "SearchByGenGetResult"加载,一切正常。

问题是:

  1. 这是架构正确吗?

  2. 如何通过调用View来映射URL中PartialView的值(例如,如果我通过DropDown选择搜索"horror"我希望在URL中看到类似{{ 1}},我想正确看到结果和选择DropDown选项访问"SearchByGen/horror"页面

  3. 感谢大家,现在代码:

    控制器代码:

    "SearchByGen/horror"

    查看SearchByGen

    public ActionResult SearchByGen()
        {
            //get the genres list
            var totalGens = _repository.GetGenrs(); 
    
            //put into List<SelectListItem> for @Dropdown it
            List<SelectListItem> items = totalGens.Select(genere => new SelectListItem { Text = genere, Value = genere }).ToList();
    
            //passing to the View
            ViewBag.TotalGen = items;
    
            return View();
        }
    
        public ActionResult SearchByGenGetResult(string gen)
        {
            //select movies by gen
            var moviesByGen = _repository.GetByGen(gen);
    
            //render partial view
            return PartialView(moviesByGen);
        }
    

    部分查看SearchByGenGetResult(未显示,经典脚手架列表视图)

2 个答案:

答案 0 :(得分:0)

您可以通过使用FormMethod.Get的表单来执行此操作,以便生成正确的URL(并添加到浏览器历史记录中)。您只需要一种方法,并且应该使用视图模型来表示要在视图中显示的内容

public class MovieVM
{
  public string Genre { get; set; }
  public SelectList GenreList { get; set; }
  public IEnumerable<Movie> Movies { get; set; }
}

public ActionResult Index(string genre)
{
  var genreList = _repository.GetGenrs(); // assume this returns IEnumerable<string>
  genre = genre ?? genreList.First();
  MovieVM model = new MovieVM
  {
    Genre = genre,
    GenreList = new SelectList(genreList),
    Movies = _repository.GetByGen(genre)
  };
  return View(model)
}

@model MovieVM
....
@using (Html.BeginForm("Index", "Movie", FormMethod.Get))
{
  @Html.LabelFor(m => m.Genre)
  @Html.DropDownListFor(m => m.Genre, Model.GenreList)
  <input type="submit" value="Search" />
}
<div id="movies">
  @foreach (var movie in Model.Movies)
  {
     ....
  }
</div>

或者,如果你想使用ajax(由于大部分html都在电影列表中,可能没有很多性能优势),你需要使用History.js或类似的插件,如this answer及其相关链接

答案 1 :(得分:0)

首先,

Architecture can be change to your project But you can look these title;
  1. 什么是Antiforgerytoken? (例如:include antiforgerytoken in ajax post ASP.NET MVC
  2. 什么是捆绑?
  3. 您还可以查看此示例(include antiforgerytoken in ajax post ASP.NET MVC
  4. 第二个问题答案;

    public PartialViewResult SearchByGenGetResult(string gen)
    {
        //select movies by gen
        var moviesByGen = _repository.GetByGen(gen);
    
        //render partial view
        return PartialView(moviesByGen);
    }
    

    查看脚本;

    var dropDownSelected = $("#TotalGen option:selected").text();
       var url = '@Url.Action("SearchByGenGetResult", "Home")/' + dropDownSelected ;
       $('#viewPlaceHolder').load(url);
    

    此处示例:(Render Partial View Using jQuery in ASP.NET MVC