0

데이터베이스의 일부 메타 데이터 테이블을 기반으로 동적으로 생성되는 양식 작업 중입니다. 나는 숫자가 setting_1, setting_53, setting_22와 같은 이름으로 입력 태그를 생성한다. 여기서 숫자는 메타 데이터의 기본 키이다. 내용이 동적이기 때문에 FormCollection을 POST 요청의 유일한 매개 변수로 사용하고 있습니다.동적 양식 작성 및 쿼리 매개 변수 전달

질문 1 : GET 요청에 대한 FormCollection과 같은 클래스가 있습니까? 쿼리 매개 변수에 직접 액세스하고 싶습니다.

질문 2 : 이러한 검색어 매개 변수를 전달해야한다면 내 URL을 쉽고 안전하게 만들 수 있습니까?

큰 걱정거리 중 하나는 OAuth를 통해 일부 설정이 채워지므로 사용자가 외부 페이지로 리디렉션됩니다. 쿼리 문자열을 "상태"로 전달해야합니다.이 상태는 사용자가 반환하면 복구해야합니다. 이 상태를 사용하여 사용자가 양식 입력 프로세스에서 중단 한 부분을 선택해야합니다. 더 많은 이유가 왜 쿼리 매개 변수를 전달하기 위해 매우 바보 같은 메커니즘을 필요로합니다.

이와 같은 동적 페이지를 다루는 사람이 있습니까? 이 페이지를 지나가는 데 좋은 패턴과 관행이 있습니까?

답변

1

글쎄, 당신은 확실히 컨트롤러 동작 내부에서 Request.QueryString을 볼 수 있습니다.

하지만 내가 그것을하고 있다면 대신 사용자 정의 모델 바인더를 쓰겠습니다.

다음은 견본 모델 바인더입니다. 나는 이것을 시험하지 않았다!

public class MyModelBinder: DefaultModelBinder 
{ 
    private static void BindSettingProperty(
     ControllerContext controllerContext, 
     ModelBindingContext bindingContext, 
     PropertyDescriptor propertyDescriptor) 
    { 
     if (propertyDescriptor.PropertyType != typeof(IDictionary<string, string>)) 
     { 
      throw new InvalidOperationException("This binder is for setting dictionaries only."); 
     } 
     var originalValue = propertyDescriptor.GetValue(bindingContext.Model) as IDictionary<string, string>; 
     var value = originalValue ?? new Dictionary<string, string>(); 
     var settingKeys = controllerContext.HttpContext.Request.QueryString.AllKeys.Where(k => k.StartsWith("setting_", StringComparison.OrdinalIgnoreCase)); 
     foreach (var settingKey in settingKeys) 
     { 
      var key = settingKey.Substring(8); 
      value.Add(key, bindingContext.ValueProvider.GetValue(settingKey).AttemptedValue); 
     } 
     if (value.Any() && (originalValue == null)) 
     { 
      propertyDescriptor.SetValue(bindingContext.Model, value); 
     } 
    } 

    protected override void BindProperty(
     ControllerContext controllerContext, 
     ModelBindingContext bindingContext, 
     PropertyDescriptor propertyDescriptor) 
    { 
     if (propertyDescriptor.Name.StartsWith("setting_", StringComparison.OrdinalIgnoreCase) 
     { 
      BindSettingProperty(controllerContext, bindingContext, propertyDescriptor); 
     } 
     else 
     { 
      base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
     } 
    } 
} 
+0

맞춤형 모델 바인더를 만들기위한 링크가 있습니까? 이 방법으로 오류를보고 할 수 있습니까? 나는 이미 수동으로 객체를 만들고 있으므로 모델 바인더는 너무 많은 작업을해서는 안됩니다. –

+0

샘플을 추가했습니다. 자신의 책임하에 사용하십시오! –