2012-02-02 2 views
2

지금 당장 어제 밤 MVC 3을 배웠습니다. 해결 방법은 매우 간단 할 것 같지만 ' 그것을위한 해결책을 찾는 것처럼 보입니다.MVC 양식 제출 - 브라우저에서 직접 액세스 할 수없는 작업으로 리디렉션

나는 간단한 문의 양식을 가지고 있습니다. 최종 사용자가 양식을 채우고 제출합니다. 그들이 양식을 제출할 때 최종 사용자를 기본적으로 "감사 페이지"인 "inquiry submitted"페이지 /보기를 렌더링하는 동일한 컨트롤러의 다른 작업으로 리다이렉트합니다.

컨트롤러가 그렇게 설정되었습니다.

public ActionResult ContactUs() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult ContactUs(ContactInfo contactInfo) 
{ 
    if (!ModelState.IsValid) 
    { 
      return View(); 
    } 

    //perform some business logic 

    return RedirectToAction("InquirySubmitted",contactInfo); 


} 

public ActionResult InquirySubmitted(ContactInfo contactInfo) 
{ 
    return View(contactInfo); 
} 

문제 : 나는 최종 사용자가 브라우저를 통해 InquirySubmitted 활동에 직접 이동하지 않습니다.
컨트롤러의 ContactUs 동작만으로 사용자를 Inquiry 제출보기로 보낼 수 있습니다.

난 단지 컨트롤러과 같이 호출 할 수 있도록 비공개 InquirySubmitted 동작을 만들기 위해 시도 :

private ActionResult InquirySubmitted(ContactInfo contactInfo) 

을하지만 내가 브라우저를 강제하고 있기 때문에 완전히에 의해 InquirySubmitted 요청에 이해 오류가 발생합니다 RedirectToAction()을 사용합니다.

그럼 내 질문에 간단합니다 :이 문제에 가장 적합한 "MVC 3 스타일"솔루션은 무엇입니까?

+1

@ Splash-X - 그가 할 수있는 한 가지 방법이지만 사용자가 어떤 이유로 페이지를 새로 고치면 연락처 요청을 다시 제출합니다. 일반적으로이를 해결하기 위해 Post-Redirect-Get 패턴을 사용합니다. –

+0

@ Splash-X 예, 솔루션이 기술적으로 작동합니다. 감사합니다. 이것은 옵션입니다. 그러나 Mystere Man이 F5 키를 눌렀을 때 새로 고침이 다시 시작되어 모든 비즈니스 로직을 다시 시작하고이 솔루션이 PRG 패턴을 깨뜨렸다 고 말하면서 좀 더 이상적인 솔루션을 기대했습니다. 현재로서는 내가 볼 수있는 유일한 해결책은 최종 사용자가 연락처 페이지에서 왔는지 확인하기 위해 세션을 사용하고 직접 InquirySubmitted에 액세스하려고 시도하면 다시 보내지 않는 것입니다. 이 솔루션은 웹 양식 솔루션과 동일합니다. – Matt

+0

@Matt 동의하지만 최종 사용자가 URL을 요청할 수 없도록 요청했습니다. 액션을 생성함으로써 항상 URL을 요청할 수 있습니다. Ek0nomik이 맞습니다. 세션 변수를 사용하여 페이지를 볼 수 있는지를 추적 할 수 있습니다. 또한 참조 URL을보고 양식 페이지인지 확인하고, 그렇다면보기를 표시하고 그렇지 않으면 양식으로 리디렉션을 리턴 할 수 있습니다. –

답변

2

사용자가 의도하지 않은 경우 사용자가 페이지를 볼 수 없도록하려면 InquirySubmitted ActionResult에 논리를 넣어야합니다.

InquirySubmitted 메소드에 이미 모델 (ContactInfo)을 전달하고 있습니다. 메소드에 전달 된 데이터를 간단히 검사 할 수 있으며, 부재중이라면 사용자를 오류 페이지 (또는 원하는 다른 페이지)로 리디렉션 할 수 있습니까?

다른 해결책은 사용자가 "ContactUs"양식을 완료했음을 나타내는 세션에서 부울을 설정하는 것입니다. 그런 다음 InquirySubmitted 내에서 해당 세션 개체를 확인할 수 있습니다.

+0

네,이 답변에 감사드립니다. 네, 저는 이것을 확실히 할 수 있으며 이것은 효과가 있습니다. 하지만, 세션에 추적 데이터를 삽입하지 않아도이를 처리 할 수없는 "MVC 3 특정 기능"이 있는지 궁금합니다. – Matt

+0

@Matt - 얼마나 안전해야합니까? 'ContactInfo' 모델을 검사하는 나의 또 다른 제안은 또한 작동 할 것입니다. 그러나이 모델은 GET 매개 변수로만 끓어 오르기 때문에 위조 될 수 있습니다. –

+0

이 솔루션은 웹 양식 앱에서 사용하는 솔루션과 동일하지만 여전히 최상의 솔루션입니다. 효과적이고 쉽습니다. public ActionResult 문의 제출 (ContactInfo contactInfo) { if (Session [ "ContactFormSubmitted"] == "true") { 세션 [ "ContactFormSubmitted"] = "false"; 돌아 가기보기 (contactInfo); } else return RedirectToAction ("ContactUs"); } – Matt

2

먼저 누군가가 문의 제출 페이지로 바로 이동할 수 있는지 누가 신경 씁니까? 기밀 정보가 있습니까? 아니면 거기에 민감한 정보가 있습니까? 그렇지 않다면, 그래서? 상처는 무엇입니까?

그러나 그렇게하기로 결정한 경우. "브라우저에서 직접 액세스 할 수없는 작업을 수행하는 방법"에 대한 질문에 대한 대답은 Html.Action()을 사용하여 페이지를 렌더링 한 다음 [ChildActionOnly] 특성을 사용하여 작업 방법을 꾸미는 것입니다.

이것은 실제로 문제를 해결하지는 않습니다. 간접적으로 액세스 할 수있는 작업 만 질문에 대한 대답으로 만들고 문제를 해결하지는 못하기 때문입니다. 궁극적으로 페이지를로드 할 URL을 사용자에게 리디렉션해야하므로 페이지를 볼 수 있는지 여부를 결정하는 논리가 필요합니다. 이것은

0

MVC3에는 여전히 적용되지만 MVC2에서는 작동하는지 확실하지 않습니다.

귀하의 global.asax 파일에 귀하의 URL이 구성되어 있습니다. InquirySubmitted를 여기에 액세스 할 수없는 URL 목록에 추가 할 수 있습니다.

관련 문제