Динамическое построение форм и передача параметров запроса - PullRequest
0 голосов
/ 19 января 2012

Я работаю над формой, которая генерируется динамически на основе некоторых таблиц метаданных в моей базе данных.Я создаю входные теги с именами, такими как setting_1, setting_53, setting_22, где число является первичным ключом метаданных.Поскольку содержимое является динамическим, я использую FormCollection в качестве единственного параметра в запросах POST.

Вопрос 1. Существует ли класс FormCollection для запросов GET?Мне нужен прямой доступ к параметрам запроса.

Вопрос 2. Если мне нужно передать эти параметры запроса, есть ли простой / безопасный способ создания моих URL-адресов?

Один из моих большихБеспокойство вызывает то, что некоторые настройки заполняются через OAuth, поэтому пользователь будет перенаправлен на внешнюю страницу.Мне нужно будет передать строку запроса как «состояние», которое мне нужно будет восстановить после возвращения пользователя.Мне нужно использовать это состояние, чтобы определить, где остановился пользователь в процессе ввода формы.Тем более, что мне нужен очень надежный механизм для передачи параметров запроса.

Кто-нибудь имел дело с такими динамическими страницами?Есть ли хорошие образцы и практики для передачи этих страниц?

1 Ответ

1 голос
/ 19 января 2012

Что ж, вы, конечно, можете посмотреть на 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);
        }
    }
}
...