2011-10-11 3 views
0

MVC 응용 프로그램의 로그온 페이지에 기존의 Accept Terms and Conditions 체크 박스를 추가하려고합니다.ASP.NET MVC 3 CheckboxFor는 모델 값에도 불구하고 이전 값을 유지합니다.

사용자가 이용 약관에 동의하지만 다른 이유로 비밀번호가 잘못되어 로그온하는 데 실패한 경우 Accept & 확인란을 선택하지 않으려면 사용자가 동의해야합니다. T & 모든 로그온 시도의 Cs입니다.

문제는 Html.CheckboxFor()를 사용하면 포스트 백 후에 확인란이 바인딩 된 Model 속성의 값에도 불구하고 이전 값을 유지한다는 것입니다.

다음은 필수 코드로 분류 된 코드입니다. 이 코드를 실행하고 확인란을 선택하고 버튼을 클릭하면 바인딩 된 모델 속성이 false 인 경우에도 체크 박스가 선택된 상태로 폼으로 돌아갑니다.

모델 :

namespace Namespace.Web.ViewModels.Account 
{ 
    public class LogOnInputViewModel 
    { 
     [IsTrue("You must agree to the Terms and Conditions.")] 
     public bool AcceptTermsAndConditions { get; set; } 
    } 
} 

검증 속성 :

public class IsTrueAttribute : ValidationAttribute 
{ 
    public IsTrueAttribute(string errorMessage) : base(errorMessage) 
    { 
    } 

    public override bool IsValid(object value) 
    { 
     if (value == null) return false; 
     if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties."); 
     return (bool)value; 
    } 
} 

보기 :

@model Namespace.Web.ViewModels.Account.LogOnInputViewModel 

@using (Html.BeginForm()) { 
    @Html.CheckBoxFor(x => x.AcceptTermsAndConditions) 
    <input type="submit" value="Log On" /> 
} 

감사관 :

[HttpGet] 
    public ActionResult LogOn(string returnUrl) 
    { 
     return View(new LogOnInputViewModel { AcceptTermsAndConditions = false }); 
    } 

    [HttpPost] 
    public ActionResult LogOn(LogOnInputViewModel input) 
    { 
     return View(new LogOnInputViewModel { AcceptTermsAndConditions = false }); 
    } 

CheckboxFor에 @checked 속성을 추가하는 제안이 on asp.net 인 것을 보았습니다. 나는 이걸 시도해보기를 만들었다.

@model Namespace.Web.ViewModels.Account.LogOnInputViewModel 

@using (Html.BeginForm()) { 
    @Html.CheckBoxFor(x => x.AcceptTermsAndConditions, new { @checked = Model.AcceptTermsAndConditions }) 
    <input type="submit" value="Log On" /> 
} 

나는 똑같은 행동을 보았다.

도움/의견을 보내 주셔서 감사합니다.

편집 : 나는 다시 게시 값을 대체 할지라도, 나는 AcceptTermsAndConditions의 유효성 검사가 실패 할 경우 메시지를 유지하고자하는 (이 사실로 그것을 필요로 AcceptTermsAndConditions에 대한 유효성 검사 속성이다), 그래서 사용할 수 없습니다 ModelState.Remove("AcceptTermsAndConditions") 그렇지 않으면 건전한 대답 인 @counsellorben이 나에게 주었다. 검증 속성을 포함하도록 위의 코드를 편집했습니다. @counsellorben에 대한 사과는 원래 명확하지 않습니다.

답변

3

ModelState를 AcceptTermsAndConditions으로 지워야합니다. 의도적으로 CheckBoxFor 및 기타 데이터 바인딩 된 도우미가 먼저 ModelState에 바인딩 된 다음 요소에 대한 ModelState가없는 경우 모델에 바인딩됩니다. 당신의 POST 액션에 다음을 추가 :

ModelState.Remove("AcceptTermsAndConditions"); 
+0

사과를, 나는'("AcceptTermsAndConditions")를'ModelState.Remove 나누기 AcceptTermsAndConditions에 대한 검증의 사용을 놓쳤다. 하나는 유효성 검사 속성을 남용한다고 주장 할 수 있습니다. AcceptTermsAndConditions'false'를 사용하여 유효성 검사 메시지없이 AcceptTermsAndConditions'false'를 사용하여 양식을 반환하려는 경우가 있습니다. 어쩌면 유효성 검사 속성에서 벗어나서 Post 메서드에서 AcceptTermsAndConditions를 수동으로 확인해야할까요? 더 많은 시간이있을 때 유효성 검사 속성을 'IClientValidatable'로 확장하려고했지만. – SamStephens