2014-07-12 9 views
1

삭제 링크가 안전한 콘텐츠를 만들고 싶습니다. 즉.AntiforgeryToken & many forms perf

행 1

편집이

가 편집 삭제 링크가 POST 링크입니다

을 삭제 행

삭제합니다.

은 내가 AntiForgeryToken 및 AntiForgeryToken 검증

using(Html.BeginForm("Delete","Home", FormMethod.Post)) 
    { 
      @Html.AntiForgeryToken()  
      @Html.Hidden("objectId", i) 
      <input type="submit" value="Delete" /> 
    } 

C#을

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Delete(int objectId) 
{ 
     SafeLogic(); 
     return View(...); 
} 

와 짝을 간단한 형태의 게시물이 작업을 수행 할 수있어, 삭제 링크가 대신 요청을 얻을의 요청을 POST 만들려면

또한이 작업을 테이블과 함께하고 싶습니다. 그러나 많은 토큰 생성과 관련하여 몇 가지 성능 문제가 있습니다 (예 :

@for (int i = 0; i < 500; i++) 
{ 
    <tr> 
    <td> Data Row @i </td> 
    <td>  
    using(Html.BeginForm("Index","Home", FormMethod.Post)) 
    { 
      @Html.AntiForgeryToken()  
      @Html.Hidden("objectId", i) 

      <input type="image" src="img_delete.gif" alt="Delete" /> 
    } 
    </td> 

} 

AntiForgeryTokens의 생성에는 어느 정도의 비용이 듭니까? 많은 AntiForgery 토큰이 생성됩니다. 최대 100 개까지 문제가 될 수 있습니다. 이 많은 인라인 html 양식을 가지고 있어도 괜찮습니까?

+0

@Josh가 아래를 대표하는 것을 보았습니다. jQuery가 페이지를 더 현대적으로 호출한다고합니다. 게시물을 작성하더라도 사용자가 전체 페이지 또는 프레임을 다시로드해야하는 양식이 있습니다. – zaitsman

+0

나는 또한 대답을 알고 싶다. 그리고 모두가 자바 스크립트를 추가 할 때 나를 완벽하게 잘 수행 할 수있는 일을 할 때 나를 귀찮게한다. 불필요한 복잡성과 취약성을 추가합니다. (나는 자바 스크립트를 잘 활용하는 매끄러운 웹 사이트에 반대하지 않는다. 그러나 내 신경을 얻는 바로이 기본 대답 일 뿐이다.) 지금까지는 아래의 답변 중 어느 것도 실제로 직접 질문에 대답하지 않는다. –

+0

받아 들여진 대답이 너무 많은 수의 antiforgerytokens의 비용/성능에 관한 질문에 답하지 못한다. ( – marapet

답변

1

나는 개인적인 프로젝트를 통해 여러분이하고있는 것과 같은 것을 필요로했습니다.

각 항목에 대해 제거 할 수있는 양식 대신 하나의 위조 토큰이있는 단일 양식이 있습니다.

@using(Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    {your HTML/Razor} 
} 

삭제 아이콘이 컨트롤러 액션을 활성화 할 아약스 호출 ...

public JsonResult Delete(int id) 
{ 
    //delete the item 
    if(success) 
    { 
     return Json(true, JsonRequestBehavior.DenyGet); 
    } 
    else 
    { 
     return Json(false, JsonRequestBehavior.DenyGet); 
    } 
} 

은 기본적으로했다 ... 그리고 그 작업은 참 또는 거짓 (성공 또는 실패)을 반환합니다. 그 정보에 따라 jQuery를 사용하여 테이블에서 항목을 제거합니다 (필자의 경우 형식이 지정된 테이블 목록). 그렇게하면 전체 페이지가 새로 고쳐지지 않았습니다.

구현하기에 적합하지 않지만 나에게 맞는 방법입니다.

모범 사례, 여러 양식 또는 여러 제출 단추가있는 단일 양식을 반드시 알 필요는 없습니다. 이러한 양식의 최종 조치가 동일한 조치를 지시하면 여러 양식을 작성하지 않아야한다고 일부 사람들은 말합니다. 더 많은 정보 : https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=html+best+practices+multiple+forms

예를 들어, 몇 개의 블록이있는 페이지가있는 경우 HTML이 얼마나 좋고 읽기 쉽도록 할지를 결정할 수 있습니다. 어질러 놓은. 그러나 5 개 또는 6 개의 블록이 있으면 귀하의 페이지가 어떻게 될지 생각하십시오.

+0

jquery & ajax를 사용하는 것이 기술적으로 페이지 이동을 방지하기 때문에 기술적으로 정확한 접근 방법이라고 생각합니다. 어떤 의미에서 인라인 양식을 사용하면 간단한 액션을 처리하기 위해 javascript 프레임 워크를 구축하는 것을 회피 할 수 있습니다. – user1778606

+0

@ user1778606 나는 같은 것을 생각하곤했지만 최근에는 자바 스크립트가 많이 추가된다는 사실을 발견했습니다. 정적 페이지 제작에 비해 오버 헤드가 매우 낮은 기능을 제공하며 백그라운드에서 모든 것이 발생하기 때문에 클라이언트의 경우보다 깨끗해 보입니다. – Josh

0

토큰을 루프 바깥으로 옮겨 모든 렌더링 성능을 회피했습니다. 나는 여전히 많은 인라인 양식이 스크립트 나 onclick 이벤트를 첨부하는 것보다 더 좋은 해결책이라고 확신하지 못합니다. 그냥 물건을 시험해보십시오.

@{var token = @Html.AntiForgeryToken();} 


@for (int i = 0; i < 5; i++) 
{ 


    using(Html.BeginForm("Index","Home", FormMethod.Post)) 
    { 
      @Html.Hidden("text", "Element:" + i) 
      @token 
      <input type="Submit"/> 
    } 
}