2012-06-18 8 views
18

문제 나 사용자가 편집 할 수있는 필드 목록을어떻게 목록

에서 항목의 ModelState 키를 얻을 수 있습니다. 모델이 제출되면이 항목이 유효한지 확인하고 싶습니다. 각 필드에는 런타임까지 알 수없는 다른 유효성 검사 프로세스가 있으므로 데이터 표기법을 사용할 수 없습니다. 유효성 검사가 실패하면 ModelState.AddModelError(string key, string error)을 사용합니다. 여기서 키는 오류 메시지를 추가 할 html 요소의 이름입니다. Razor가 html 항목에 대해 생성하는 이름은 필드 목록이므로 Fields[0].DisplayName과 같습니다. 내 질문에 메서드 또는보기 모델에서 생성 된 HTML 이름의 키를 얻는 방법은 무엇입니까?

솔루션 시도

나는 행운과 키의 toString() 방법을 시도했다. 또한 HtmlHelper 클래스를 살펴 보았지만 도움이되는 방법을 찾지 못했습니다.

코드 조각

보기 모델

public class CreateFieldsModel 
{ 
    public TemplateCreateFieldsModel() 
    { 
     FreeFields = new List<FieldModel>(); 
    } 

    [HiddenInput(DisplayValue=false)] 
    public int ID { get; set; } 

    public IList<TemplateFieldModel> FreeFields { get; set; } 


    public class TemplateFieldModel 
    { 
     [Display(Name="Dispay Name")] 
     public string DisplayName { get; set; } 

     [Required] 
     [Display(Name="Field")] 
     public int FieldTypeID { get; set; } 
    } 
} 

컨트롤러

public ActionResult CreateFields(CreateFieldsModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     //Where do I get the key from the view model? 
     ModelState.AddModelError(model.FreeFields[0], "Test Error"); 
     return View(model); 
    } 
} 

답변

24

소스 코드를 파헤쳐 본 결과 해결책을 찾았습니다. EditorFor()이 호출 될 때 필드의 html 이름을 생성하는 데 사용되는 ExpressionHelper 클래스가 있습니다. ExpressionHelper 클래스에는 해당 html 요소의 이름 인 문자열을 반환하는 GetExpressionText()이라는 메서드가 있습니다. 여기에 그것을 사용하는 방법입니다 ...

+4

이것은 좋은 일이지만 멋진 확장 메서드에서이 논리를 감싸는 또 다른 게시물을 발견했습니다. http://stackoverflow.com/a/12689563/1825109 – Michael12345

0

당신은 기반 컨트롤러 내부의 키 (입력 요소의 이름을) 프레임해야 당신이 f를 렌더링하는 방법에 따라 형태로 ields.

예 : 컬렉션의 두 번째 항목에 대한 유효성 검사가 CreateFieldsModel에 실패하면 입력 요소의 이름 즉, 유효성 검사 오류가 매핑 될 FreeFields[1].DisplayName이라는 키의 프레임을 지정할 수 있습니다.

내가 아는 한 컨트롤러에서 쉽게 알 수 없습니다.

+0

어쩌면 이름이 상수 값이고 필드 값이 name 속성을 제외하고 EditorFor 메소드의 출력이 될 수 있습니까? –