2009-10-13 4 views
0

좋은 MVC 응용 프로그램이 지금 실행 중이며 일부 AJax 기능을 추가하고 있습니다. 나는 10 항목을 표시하는 테이블을 가지고 특정 사용자 만 특정 항목을 볼 수 있습니다. 사용자가 새 게시물을 추가하면 아약스를 설정하여 새 항목을 저장합니다.Asp.Net MVC Ajax 및 페이지의 로딩 측면 (보기)

그러나 테이블을 업데이트해야 할 필요가 없으므로 사용자가 어떤 상태인지 알 수 없으므로 새 행을 삽입 할 수 없습니다 (일부 사용자는 해당 행을 볼 수 없음). 이것이 웹 폼이라면 나는 테이블을 덤프하는 페이지를 가지고있을 것이고, JQuery를 사용하여 트리밍 된 '페이지'의 내용을 현재 페이지의 관련 슬롯에로드 할 것입니다.

MVC로 이것을 달성하는 가장 좋은 방법은 무엇입니까? 반환

감사

+1

[Authorize (Roles = "Admin")]과 같이 authorize 태그를 사용하여 제어기 작업을 꾸밀 수 있습니까? 이 역할의 사용자 만 행을 삽입 할 수 있습니다. JQuery는 컨트롤 메서드를 호출 할 수 있습니다. – Davy

답변

1

@ Robert Koritnik이 제시 하듯이이를 처리하는 가장 좋은 방법은 PartialView를 사용하는 것입니다. 저는 두 개의 분리 된 컨트롤러 액션을 제안 할 것입니다 - 원래 요청을 처리하는 액션과 AJAX 새로운 엔트리를 처리하는 액션. 두 작업 모두 동일한 논리를 호출하여 테이블의 데이터를 가져옵니다. 전자는 데이터를 다른 페이지 데이터와 함께 뷰 모델에 넣습니다. 후자는 데이터를 부분 뷰의 모델로 패키징합니다.

모델 클래스

public class PageViewModel 
{ 
    .... 
    public IEnumerable<TableViewModel> TableData { get; set; } 
} 

public class TableViewModel 
{ 
    ... 
} 

컨트롤러 코드

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Index() 
{ 
    var model = new PageViewModel(); 
    model.TableData = GetTableForUser(this.User); 

    return View(model); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AddEntry(...) 
{ 
    ... add the new entry ... 
    var model = GetTableForUser(this.User); 

    return PartialView("TableView", model); 
} 


private TableViewModel GetTableForUser(IIdentity user) 
{ 
    ... 
} 

보기 코드

홈페이지보기

<% Html.RenderPartial("TableView", model.TableData); %> 

<script type="text/javascript"> 
    $('#entryForm').submit(function() { 
     $.post('<%= Url.Action("addentry", "controller") %>', 
       $('#entryForm').serialize(), 
       function(data) { 
        $('#table').replaceWith(data); 
       }, 
       'html'); 
     return false; 
    }); 
</script> 

의 TableView

<table id="table"> 
<% foreach (var row in Model) { %> 
    <tr> 
    ... 
    </tr> 
<% } %> 
</table> 
1

사용 PartialView 기능은 바로 <table> 당신이 필요합니다. 기본 페이지에 포함되지만 Ajax 호출에서는 기존 <table> 요소를 대체하는 데 사용할 수있는 HTML 만 클라이언트에 보냅니다.

+0

이것은 내가 찾는 것 같다. 그러나 부분 뷰를 탐색하려고 할 때마다 Jquery AJAX를 통해 페이지에 부분 뷰를 어떻게 추가 할 수 있습니까? THanks – LiamB

0

내가 올바르게 이해하면 사용자 A는 항목 목록을보고 사용자 B는 (아마도 세계의 다른 일부에서는) 새로운 항목을 게시한다고 말하고있는 것입니다. 새 항목이 사용자 A가 볼 수있는 항목 인 경우에만 사용자 A 화면의 목록을 업데이트 할 수 있습니까?

이 경우 페이지에서 타이머가 실행될 수 있으며 타이머가 트리거되면 서버에 대한 AJAX 호출이 발생하여 사용자에게 새로운 항목이 있는지 묻습니다. 사용자의 신원과 - 따라서 - 그들이 볼 수있는 항목은 세션에서 결정되어야합니다 (정확한 작동 방식은 특정 아키텍처에 따라 다르지만, 이미이 작업을 수행하고있는 것으로 추측합니다. 사용자 A에 대한 항목)로 시작하는

여기에서 고려해야 할 좋은 정보의 모든 종류의 ... 있습니다

  1. 얼마나 자주해야 타이머 트리거, 적시에 업데이트를 얻을 수 있지만없이하기 위해 서버에 과도한 트래픽을 유발합니다.
  2. 전체 목록을 업데이트하면됩니다 (코드가 간단 해짐) 또는 새 항목 만 다운로드해야합니다 (논리가 더 복잡해집니다. b 또한 트래픽을 작게 유지)
  3. 사용자를 올바르게 식별하고 항목을 올바르게 필터링하여 관련 항목 만 표시하도록하려면 어떻게해야합니까?

그것은 비교적 간단한 시나리오 - 그리고 더 너무 드문 없습니다 것 -. 그러나 그것은에 설정 합병증을 방지하기 위해 합리적인 방식으로 접근 할 필요가

0

IT는 저장됩니다 쿠키를 추가 할 어렵지 않다 사용자의 현재 상태를 확인하거나 다른 Ajax 호출을 추가하여 사용자가 권한이 있는지 여부를 확인할 수 있습니다. 컨트롤러에서 사용자가 권한이 있는지 여부에 관계없이 모든 상황을 처리하기위한 항목을 만들면됩니다.

정확히 무엇이 필요합니까?