【问题标题】:asp.net mvc rendering partial view on-demandasp.net mvc 按需渲染局部视图
【发布时间】:2013-01-31 09:30:17
【问题描述】:

我是 asp.net mvc 的新手,我想知道我所做的是否正确。

我想创建一个用于搜索人的视图。到目前为止,这是我所拥有的:

  • 商业模式类:

    public class Person
    {
      public int Id { get; set; }
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public Address Address { get; set; }
      public DateTime DOB { get; set; }
      public List<Telephone> Telephones { get; set; }
    }
    
  • ViewModel 类:

    public class SearchPersonViewModel
    {
      public int Id { get; set; }
      public string FullName { get; set; }
      public string LicencePlate { get; set; }
      public string CarMake { get; set; }
      public string CarModel { get; set; }
    }
    
  • 局部视图:

    @model IEnumerable<MvcApplication2.Models.SearchPersonViewModel>
    
    @foreach (var item in Model)
    {
     @Html.DisplayFor(m => item.Id)
     @Html.DisplayFor(m => item.FullName)              
    }
    
  • 调用局部视图的视图:

    @Html.Action("Search", "Person");
    

*PersonController中的控制器方法:

    [ChildActionOnly]
    public ActionResult Search()
    {
         List<SearchPersonViewModel> model = new List<SearchPersonViewModel>();
         model.Add(new SearchPersonViewModel() { FullName = "test", Id = 3 });

        return PartialView("_SearchPerson", model);
    }

现在的问题是每当加载主视图时都会调用 Search 方法。我想要的是在主视图上添加一个搜索文本框,用于过滤在部分视图中呈现的集合。我怎么能那样做?

【问题讨论】:

    标签: asp.net-mvc partial-views


    【解决方案1】:

    这样你的局部将只在点击时呈现

    <script>
    
    (function($){
       $('#btn').click(function(){
          $('#searchresult').load('@Url.Content("~/Person/Search")');
    
    }
    </script>
    

    【讨论】:

    • 我已经这样做了,现在注意到我正在向控制器传递一个参数: $("#divResult").load('/Person/Search', $("# txtSearch").val());我现在遇到的问题是参数在控制器中始终为空。但是,例如,如果我浏览到 url /Person/Search/s,则参数为“s”,这是正确的。那么这次我在 javascript 中做错了什么?
    • 我现在开始工作了: $("#divResult").load('/Person/Search?criteria=' + $("#txtSearch").val());我没有为参数传递正确的名称....
    • 不错。 jquery 来救援!
    【解决方案2】:

    向 /search 发出 ajax 请求并将数据附加到您的页面。

    <div id = 'searchresult'>
    @Html.Action("Search", "Person");
    </div>
    

    每当您想要过滤调用类似 $('#searchresult').load('/search?q=xxx');

    【讨论】:

    • 但是在加载视图时仍然会调用 action 方法。我只希望在用户点击搜索按钮时调用它。另外,您如何看待我组织代码的方式?这是正确的架构吗?
    • 去掉这条语句@Html.Action("Search", "Person");
    • 是的,你组织得很好。为视图和局部视图创建视图模型是一个很好的方法。
    【解决方案3】:

    您可以使用两种方式:

    • microsoft ajax 助手
    • jquery

    对于他们两个,您需要删除 [ChildActionOnly]@Html.Action("Search", "Person");

    看这个例子:Using Ajax.BeginForm with ASP.NET MVC 3 Razor

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多