2017-05-04 1 views
3

표 목록을 표시하는 목록 페이지 (색인)가 있습니다. 페이지는 상단에 작은 양식과 하단에 격자 (목록)로 구성됩니다. 이 양식은 목록에 표시된 항목을 필터링하는 방법으로 사용됩니다.페이지가 양식 제출 결과 또는 다른 방법으로 표시되는지 확인하는 방법

두 개의 버튼 중 하나를 클릭하여 양식을 제출하거나 다른 페이지에서 링크를 클릭하거나 브라우저의 주소 표시 줄에 URL을 직접 입력하여 페이지가 표시되는지 확인해야합니다.

보기 :

@model MyNameSpace.ViewModels.FooFilterViewModel 

@{ 
    ViewBag.Title = "Foo Listing"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>@ViewBag.Title</h2> 

@using (Html.BeginForm("Index", "Home", FormMethod.Get)) 
{ 
    @Html.ValidationSummary(true) 

    <!-- Field controls used for filtering go here --> 

    <input id="ClearFilter" type="button" value="Clear Filter" /> 
    <input id="ApplyFilter" type="submit" value="Apply Filter" /> 
} 

<!-- Grid displaying the list of foos goes here --> 

컨트롤러 액션 :

당신이뿐만 아니라, 양식을 제출 이러한 방법 (모든 GET으로 양식을 보내는 때문에
public ActionResult Index(FooFilterViewModel fooFilterViewModel) 
{ 
    // Retrieve all records 
    IQueryable<Foo> foos = _DBContext.Foos; 

    if (ModelState.IsValid) 
    { 
     if (/* check if coming from form submission */){ 
      // Do something 
     } 
     else 
     { 
      // Do something else 
     } 

     // Code to filter records go here 
     foos = foss.Where(f => f...........) 
    } 

    fooFilterViewModel.Foos = foos; 

    return View(fooFilterViewModel); 
} 
+0

일반적으로 메서드 서명이 'public ActionResult Index()'인 추가 컨트롤러 동작이 있으며 주소 표시 줄의 클릭 된 링크 또는 URL 항목에서 라우팅 될 때 적중 될 메서드입니다. –

+1

ViewModel에 부울 속성을 false로 설정하기 만하면됩니다.이 속성을 true로 설정하면 양식에 숨겨진 필드를 추가해야합니다. 컨트롤러에서이 속성을 확인합니다. 이것을 관리하지 않으면 나중에 예제를 게시 할 것입니다 –

+0

Thanks @ LucianBumb. 더 나은 해결책을 찾지 못하면 숨겨진 속성을 사용하려고 생각 중입니다. – corix010

답변

2

이 링크를 다음 , 주소 표시 줄에 URL을 입력)은 서버의 관점에서 기능상 동일합니다. 그들은 모두 동일한 URL에 대한 GET 요청입니다.

제출 양식을 차별화해야하는 경우 숨겨진 필드를 추가하거나 제출 버튼의 이름을 지정할 수 있습니다. 어느 경우 든 Request 개체를이 이름으로 검사 할 수 있으며,이 개체가 있으면 양식이 제출되었다고 가정 할 수 있습니다. 그런 다음

<button type="submit" name="FormSubmitted">Submit</button> 

:

if (Request["FormSubmitted"] != null) 
{ 
    // form was submitted 
} 

그러나이 쉽게 위조 할 수 있습니다. 예를 들어 누군가 URL을 입력하기 만하면 알 수있는 방법이 없습니다. 나는 악의적 인 사용자가이 시나리오에 얼마나 많은 관심을 가질 지 확신하지 못한다. 그러나 당신이 더 모호한 것으로 보이게함으로써 다소 완화시킬 수있다. 그래서 "FormSubmitted"만큼 명백하지 않다. 또는 JavaScript를 사용하여 양식에있는 항목을 설정 한 다음이를 축소 된 외부 파일에 묻을 수도 있습니다. 여전히, 모호함을 통한 보안은 여전히 ​​보안이 아닙니다.

그러나 그 짧은 것은 말할 것도 없습니다. 다시 말하지만,이 모든 메소드는 서버와 완전히 동일하게 보입니다. 메서드를 구별하기 위해 실제 요청은 쿼리 문자열 변경, GET 대신 POST로 보내기 등과 같이 다른 방식으로 달라야합니다. 그렇지 않으면 정확히 동일한 요청 인 경우 서버가 그것이 어떻게 생겼는지 신경 써라.

+0

고마워요 @ 크리스 프랫. "필터 적용"과 "필터 지우기"라는 두 개의 버튼이 있습니다.이 버튼을 클릭하면 양식 제출과 함께 제출해야합니다. 이 경우에도 솔루션이 계속 작동합니까? 둘 다 "FormSubmitted"라고해야합니까? – corix010

+1

그래,이 목적을 위해서, 그건 중요하지 않습니다. 어느 버튼을 클릭하든 버튼의 이름이 요청에 추가됩니다. 그러나,'ApplyFilter'와'ClearFilter'의 이름을 정하는 것이 더 낫습니다. 이름을 사용하고있는 것을 다소 가려 내기 때문입니다. 그런 다음 해당 이름 중 하나가 요청에 포함되었는지 여부를 간단히 확인할 수 있습니다. –

+0

감사합니다. @Chris Pratt. 나는 그것을 시도 할 것이다. – corix010

관련 문제