2011-08-09 2 views
1

일반적인 뷰 (레이아웃의 @RenderBody())에 표시된 유효성 검사 (서버 측 및 클라이언트 측)로 로그인 부분 뷰 (사용자 이름, 비밀번호 및 제출 버튼) 및 모델 (일부 컨트롤 및 제출 버튼)이있는 레이아웃이 있습니다.기본 뷰에서 서버 측 유효성 검사가 부분 뷰에서 유효성 검사를 중지시키는 이유는 무엇입니까?

내 문제는 내보기에서 서버 측 유효성 검사를 수행 할 때 로그인 부분보기의 유효성을 검사 할 때 로그인의 httppost 기능을 실행하기 때문입니다. 어떻게 그걸 막을 수 있니?

로그인 뷰 컨트롤러

[HttpGet] 
    public ActionResult LogOn() 
    { 
     return PartialView(); 
    } 

    // 
    // POST: /Account/LogOn 

    [HttpPut] 
    public ActionResult LogOn(LogOnModel model) 
    {    
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       ViewBag.UserName = model.UserName; 
      } 
      else 
      { 
       ModelState.AddModelError("", Resources.Account.Account.LoginFailureText); 
      } 
     } 

     return PartialView(model); 
    } 

및 모델 컨트롤러는

public ActionResult MyModel() 
    { 
     ViewBag.DisplayThxMsg = false; 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult MyModel(Models.FeedbacksModel feedback) 
    { 
     if (ModelState.IsValid) 
     { 
      //do something 
     } 
     else{ 
      //do another thing 
     } 
     return View(feedback); 
    } 

답변

1

이해하는 문제는 매우 어려운 찾을 수 있습니다. 귀하의 문제를 짐작하면 사이트 레이아웃의 일부로 로그인 부분 컨트롤이 표시되고 모든 페이지에 표시됩니다. 따라서 페이지를 제출하는 동안 사용자 이름 비밀번호 확인이 시작되고이를 방지하고 싶습니다.

모든 검증 @ 서버 있음을 이해 - 등록 정보가 게시 된 필드에 바인딩으로 모델이 결합하면서 측면이 발생, 필드의 속성에보고하고 음식을 제공 했었죠/영광. 따라서 서버 측 유효성 검사를 방지하려면 로그인 부분보기를 에 넣으십시오. 페이지의 다른 양식을 제출하는 동안 자신의 양식이 전송되지 않습니다.

로그인 양식과 의견 양식의 2 가지 형식이 있습니다. 모든 입력 필드를 같은 양식에 두지 마십시오.

그 후에 유효성 검사 오류가 계속 발생하면 유형 변환 문제와 같은 다른 이유 때문입니다. 기본 모델 바인더. 샘플 DataAnnotations 모델 바인더가 DataAnnotations에서 가져가 속성 유효성 검사 오류와 모델 상태를 채울 것 (에 "INT는"뭔가를 비 숫자를 통과, 예를 들어) 기본 유형 변환 문제에 대한 약간의 오차가 추가됩니다 귀하의 모델. 당신이 행 번호 (125)

@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");} 

보면

편집

사용자는 로그인 양식을 렌더링 위의 코드가 있습니다. 그것은 라인 (45)

<form id="form1" runat="server" method="post"> 

에서 다른 형태의 내부 그렇게 할 것이 </html>

당신은

<form id="form1" runat="server" method="post"> 
@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");} 
</form 

에서 구조를 변경해야까지가 전체 문서를 포함한다, 따라서 끝 태그가 없습니다 ~

<form id="form1" runat="server" method="post"> 
</form> 
@using (Html.BeginForm()){Html.RenderAction("LogOn", "Account");} 

Th @@@(Html.BeginForm()){Html.RenderAction("LogOn", "Account");}은이 양식을 <form id="LoginView1" action="LogOn">과 그 하위 요소로 렌더링합니다.

은 편집 레이아웃 페이지 사용에

를 최신 : 대신의 @Html.Partial("~/Views/Shared/LogOnPartial.cshtml", new LogOnModel()) : @Html.Action("LogOnPartial", "Account")

는 모든 작품이 이유는, [HttpPost]로 표시된 LogOnPartial 방법이 있기 때문이라고

요청이 POST 컨텍스트에있었습니다. 원하는 것은, 게시 할 때조차도 액션을 실행하지 않고보기 만하면됩니다. 위의 코드는 그렇게합니다. 액션 메소드를 호출하지 않고 뷰를 렌더링합니다. MVC3은 어리석은 servent의 일종입니다 : 요청이 포스트 컨텍스트에있을 때 [HttpPost]으로 표시된 Action 메서드를 호출해야한다는 것을 알고 있습니다. 요청이 다른 조치 (색인)에 대한 사후 컨텍스트에 있고이 요청 (로그 분할)이 아니라는 것을 알 수 있습니다. 이제이 방법을 제거 할 수 있습니다.

public ActionResult LogOnPartial() 
     { 
      return PartialView(); 
     } 

더 이상 사용되지 않습니다.

성공적인 로그인시 return PartialView(model); 대신 return RedirectToAction("Index","Home");을 반환하도록 계정 컨트롤러의 LogOnPartial 메서드를 변경해야합니다. 그리고 FAILURE에서는 코딩 한대로 부분보기를 렌더링 할 수 없습니다. 완전히 새로운보기를 반환해야합니다. 인덱스도 LogonPartails도 아니어야합니다. 자체 레이아웃이있는 return View("Login_Error_View"); 만 반환하면됩니다. 그렇지 않으면 워크 플로우를 제어하기 어려울 것입니다.

+0

로그인이 이미 있지만 여전히 문제가 표시되고 DataAnnotations 모델 바인더가 필수 필드 오류를 반환합니다. 마녀 제출 버튼을 클릭하는 것을 말하는 방법이 있습니까? –

+0

렌더링 된 HTML을 확인하여 두 개의 별도의 중첩되지 않은 양식 태그가 만들어 졌는지 확인 했습니까? 하나의 양식은 로그인 용이고 다른 양식은 피드백 용입니다. 중복되거나 중첩되어서는 안됩니다. 이것이 사실인지 알려주세요. – Zasz

+0

모든 관련 뷰를 http://pastebin.com/에 붙여 넣거나 볼 수 있도록 붙여 넣습니다. 사람들은 종종 레이아웃 파일에 양식을 추가하고 부분보기에 하나의 양식을 추가합니다. 이러한 중첩이 아마도 오류를 일으킬 수 있습니다. – Zasz

관련 문제