2013-07-08 2 views
1

많은 프로젝트 (이름, 설명, 마감 시간 등)가 포함 된 EF를 사용하는 MVC 프로젝트가 있습니다. 그들은 또한 그들과 관련된 지역과 활동 상태 (과정, 비활성, 등등)와 같은 특정 것들을 가지고 있습니다. 내가 뭘 하려는지 부분적인보기를 통해 telerik 드롭 다운 목록을 사용하여 이들을 필터링하는 것입니다. 나는 또한 변화에 쿠키에 마지막 상태 필터를 저장하려고 시도합니다.쿠키에 저장된 MVC 필터가 저장되지 않습니다.

내가 겪고있는 문제는 필터를 변경하면 변경시 이벤트가 항상 호출되지 않는다는 것입니다.

색인은 포함 된 응용 프로그램의 외부 셸을로드하는 데 사용됩니다.

  1. telerik의 드롭 다운이 부분도
  2. 동안 변화 이벤트와
  3. 로드 프로젝트를 Viewbag를 사용하여 생성 다른 웹 페이지의 상단 네비게이션 메뉴 생성되어 관련 사업

페이지 로딩의 첫 번째 인스턴스에 대해 쿠키 상태가 여기에서 읽혀집니다.

 [HttpGet] 
     public ActionResult Index() 
     { 

      int Region_ID = -1; 
      int State_ID = -1; 

      if (this.ControllerContext.HttpContext.Request.Cookies.AllKeys.Contains("Cookie")) 
      { 
       List<string> str = this.ControllerContext.HttpContext.Request.Cookies["Cookie"].Value.Split(',').ToList<string>(); 
       Region_ID = Convert.ToInt32(str[0]); 
       State_ID = Convert.ToInt32(str[1]); 

      } 

      db = new DashboardEntities(); 
      var filterRegion = new SelectList(db.Region.Where(m => m.Active).OrderBy(n => n.Name), "ID", "Name",Region_ID).ToList(); 
      var filterState = new SelectList(db.State.Where(m => m.Active).OrderBy(n => n.Name), "ID", "Name",State_ID).ToList(); 


      filterRegion.Insert(0, new SelectListItem { Text = "All", Value = "-1" }); 
      filterState.Insert(0, new SelectListItem { Text = "All", Value = "-1" }); 

      ViewBag.FilterRegionSelectList = filterRegion; 
      ViewBag.FilterStateSelectList = filterState; 

      var prj = (db.Project.Include("Builder").Include("ProjectNotes").Where(m => m.Builder.Region_ID == Region_ID || Region_ID == -1) 
         .Where(m => m.State_ID == State_ID || State_ID == -1) 

      return View(prj); 
     } 

부분은 페이지를 처음로드 한 후 필터 변경 사항을 표시하는 데 사용됩니다. 또한 필터가 변경되면 올바른 프로젝트 콜렉션을 다시로드 할 때 쿠키가 여기에 업데이트됩니다.

public PartialViewResult DashboardPartial(int id, int state) 
    { 
     db = new DashboardEntities(); 

     var filterRegion = new SelectList(db.Region.Where(m => m.Active).OrderBy(n => n.Name), "ID", "Name", id).ToList(); 
     var filterState = new SelectList(db.State.Where(m => m.Active).OrderBy(n => n.Name), "ID", "Name", state).ToList(); 


     filterRegion.Insert(0, new SelectListItem { Text = "All", Value = "-1" }); 
     filterState.Insert(0, new SelectListItem { Text = "All", Value = "-1" }); 


     ViewBag.FilterRegionSelectList = filterRegion; 
     ViewBag.FilterStateSelectList = filterState; 


     HttpCookie cookie = new HttpCookie("Cookie"); 
     cookie.Value = id.ToString() + "," + state.ToString() ; 
     this.ControllerContext.HttpContext.Response.Cookies.Add(cookie); 

     var prj = db.Project.Include("Builder").Include("ProjectNotes").Where(m => m.Builder.Region_ID == id || id == -1) 
        .Where(m => m.State_ID == state || state == -1); 

     ViewBag.Model = prj; 

     return PartialView(prj); 
    } 

보기는에 변화 이벤트를 처리 할 수있는 몇 가지 자바 스크립트가 포함되어 있습니다. 나는 telerik 드롭 다운리스트의 on-change 이벤트를 filterChange() 함수로 만들어서이 작업을 수행한다. 당신은 어쨌든의 코드를 개선 할 수있는 방법을 보면

@using Dashboard.Helpers 

@{ 
    ViewBag.Title = "Dashboard"; 
} 


<script type="text/javascript"> 

    function filterChange() { 
     $("#log").ajaxError(function (event, jqxhr, settings, exception) { 
      alert(exception); 
     }); 

     var regionValue = $('#filterRegion').data('tDropDownList').value(); 
     var stateValue = $('#filterState').data('tDropDownList').value(); 


     //alert('Index: ' + regionValue.toString() + ',' + stateValue.toString()); 


     $.get('@Url.Action("DashboardPartial")', 
     { id: regionValue.toString(), state: stateValue.toString() }, function (data) { 
      $("#target").html(data); 
     }); 

    } 
</script> 

<div style="width: 100%; height: 100%"> 
    <fieldset>  
     <legend>Filters</legend> 
     <div> 
      @using (Html.BeginForm()) 
      { 
      <div class="Filter-Div"> 
       <div style="float: left;"> 
        @Html.Label("Region:") 
       </div> 
       <div style="float: left;"> 
        @Html.Telerik().DropDownList().Name("filterRegion").BindTo((List<SelectListItem>)@ViewBag.FilterRegionSelectList).ClientEvents(events => events.OnChange("filterChange")) 
       </div> 
      </div> 
      <div class="Filter-Div"> 
       <div style="float: left;"> 
        @Html.Label("Project State:") 
       </div> 
       <div style="float: left;"> 
        @Html.Telerik().DropDownList().Name("filterState").BindTo((List<SelectListItem>)@ViewBag.FilterStateSelectList).ClientEvents(events => events.OnChange("filterChange")) 
       </div> 
      </div> 

      <div class="Filter-Div"> 
       <table class="noborder"> 
        <tr class="noborder"> <input type="submit" value="Export" name="btnName" /> </tr> 
       </table> 
      </div> 
      } 

     </div> 
    </fieldset> 
    @(Html.Telerik().ScriptRegistrar() 
    .DefaultGroup(group => group 
       .Add("telerik.common.js") 
       .Add("telerik.tabstrip.min.js") 
       .Add("telerik.calendar.min.js")) 
    .jQuery(false)) 
    <div> 
    @if (User.IsInRole("SuperUser") || User.IsInRole("Admin")) 
    { 
     @Html.ActionLink("Create New", "Create", new { controller = "Dashboard", page = "Index" }, new { @class = "t-button" }) 
    } 
    </div> 
</div> 

<div id="target"> 
    @{ Html.RenderPartial("DashboardPartial"); 

    } 
</div> 

내가 MVC 따라서 엔티티 프레임 워크에 새로운 오전 양해하여 주시기 바랍니다. 도움이 되었습니까?

사이드 노트 - 현재 EF를보기로 직접 전달하는 대신 프로젝트의 Viewmodel 표현을 구현하고 있습니다.

답변

1

문제가 해결되었습니다.

문제는 기본적으로 해당 세션에서 생성 된 모든 부분보기 결과에 대해 부분보기가 캐시되고 있다는 것이 었습니다. 그러한 부분적인 행동은 시간마다 필터가 변경된 후에 게시되지 않았습니다. 내 부분 작업에서 OutputCache HTML 특성을 사용하여 캐싱을보다 적절한 시간으로 제한 할 수있었습니다.

[OutputCache(Duration=(number of seconds))]