2009-12-30 4 views
0

MVC 앱에 드롭 다운 목록이있는 양식이 있습니다. 이제 믹스에 밸리데이션을 추가하려고 시도 했으므로 값이 무엇이든 관계없이 드롭 다운 목록이 유효성 검사에 실패한 것처럼 보입니다.ASP.NET MVC. 값에 관계없이 드롭 다운시 유효성 검사가 실패합니다.

유효성 검사없이 컨트롤러가 계획대로 작동하고 리디렉션 할 수 있습니다. 유효성 검사를 수행하면 데이터베이스 변경이 발생할 수 있지만 ModelState.IsValid는 false입니다.

막혔습니다. 이것은 알려진 문제입니까?

보기 :

<label for="parent">Child of:</label> 
<%= Html.DropDownList("parent", (SelectList)ViewData["pageList"])%> 
<%= Html.ValidationMessage("parent") %> 

컨트롤러 조치 :

[AcceptVerbs(HttpVerbs.Post)] 
[ValidateInput(false)] 
[ValidateAntiForgeryToken()] 
public ActionResult Create(Page page) 
{ 
    try 
    { 
     pageRepository.Insert(page); 
    } 
    catch (RuleException ex) 
{ 
    ex.CopyToModelState(ModelState); 
} 

if (!ModelState.IsValid) 
{ 
    var pageSelectList = pageRepository.GetTop().ToList(); 
    pageSelectList.Add(new Page 
{ 
    menuTitle = "None" 
}); 
    ViewData["pageList"] = new SelectList(pageSelectList.OrderBy(x => x.listOrder), "ID", "menuTitle"); 
    return View(); 
} 
return RedirectToAction("List"); 
} 

오류가 반환은 다음과 같습니다 값 'X'이 (가) 잘못되었습니다. 여기서 'x'는 현재 선택 항목의 숫자 값입니다. 선택된 값이 무엇이든 상관없이 오류가 발생합니다.

public class Page 
{ 
    private EntityRef<Page> _parent = default(EntityRef<Page>); 
    private EntitySet<Page> _children = new EntitySet<Page>(); 

    public int ID { get; set; } 
    public string pageTitle { get; set; } 
    public string menuTitle { get; set; } 
    public string content { get; set; } 
    public int listOrder { get; set; } 
    public bool visible { get; set; } 
    public int parent { get; set; } 
    public DateTime? created { get; set; } 
    public DateTime? edited { get; set; } 
    public string createdBy { get; set; } 
    public string lastEditBy { get; set; } 
    public string linkInfo { get; set; } 
    public bool IsSelected { get; set; } 

    public Page Parent 
    { 
     // return the current entity 
     get { return this._parent.Entity; } 
     set { this._parent.Entity = value; } 
    } 

    public EntitySet<Page> Children 
    { 
     get { return this._children; } 
     set { this._children.Assign(value); } 
    } 

    public static Page Error404() 
    { 
     return (new Page 
     { 
      content = "<p>Page not found</p>", 
      pageTitle = "404. Page not found" 
     }); 
    } 
} 

는 여기에 내가 해결을 위해 노력 무엇 :

public ActionResult Create([Bind(Exclude="parent")] Page page) 
{ 
    page.parent = Convert.ToInt32(Request.Form["parent"]); 
... 

은 그냥 ModelBinding에서 드롭 다운리스트를 제외하고 뒤쪽에으로 Request.Form을 통해 그것을 다시로드. 좋은 습관입니까?

답변

0

ModelState [ "parent"]에 대한 테스트가 끝났습니다. int에 문자열을 넣으려고 시도 할 때 Null 인 entity 속성 대신 Value.AttemptedValue가 사용되었습니다.

+0

모델 상태를 지우는 것도 언급해야합니다 : \t \t \t ModelState.명확한(); 그런 다음 오류와 값을 다시 추가하십시오. \t \t \t ModelState.AddModelError (field, error); \t \t \t ModelState.SetModelValue (field, ValueProvider [field]); – mark123

0

무엇이 RuleException을 던집니까? 난 "부모"속성이 유효한지 여부를 확인하기 위해 일종의 검증 엔진을 사용하고 있다고 가정합니다. 나는 왜이 예외가 던져지고 있는지 살펴 보려고했다. 아마도 값이 컨트롤러 동작에 올바르게 전달되지 않았거나 유효성 검사 규칙이 생각하는 것과 다를 수 있습니다.

+0

그게 전부입니다. 나는 부모를 전혀 테스트하지 않았습니다. 모델의 바운드 필드이지만 유효성을 판단 할 테스트가 없습니다. 나는 그것이 DomainModel의 int로 정의되어 있고 dropdownlist의 값은 항상 바인딩 중에 유효성 검사에 실패한 이유 일 수있는 문자열이라고 생각하고 있습니다. – mark123

+0

그런 경우 DropDownList를 int에 바인딩하려면 어떻게해야합니까? – mark123

+0

페이지 클래스를 붙여야 볼 수 있습니다. "RuleException"을 throw한다는 사실은 유효하지 않은 Page 객체를 데이터베이스에 저장하려고 할 때 유효성 검사 엔진을 사용한다는 것을 나타냅니다. 어떤 경우에는 위반하는 규칙을 찾아야합니다. 어쩌면 최소/최대 값이있을 수 있습니까? –

관련 문제