0

我正在研究一个基于我数据库中的一些元数据表动态生成的表单。我创建名称为setting_1、setting_53、setting_22 的输入标签,其中数字是元数据的主键。由于内容是动态的,我使用 FormCollection 作为 POST 请求的唯一参数。

问题 1: GET 请求是否有类似 FormCollection 的类?我想直接访问查询参数。

问题 2:如果我需要传递这些查询参数,是否有一种简单/安全的方法来构建我的 URL?

我最大的担忧之一是某些设置是通过 OAuth 填充的,因此用户将被重定向到外部页面。我必须将查询字符串作为“状态”传递,一旦用户返回,我就需要恢复它。我将需要使用此状态来获取用户在表单输入过程中离开的位置。更重要的是为什么我需要一个非常简单的机制来传递查询参数。

有没有人处理过这样的动态页面?传递这些页面是否有好的模式和实践?

4

1 回答 1

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);
        }
    }
}
于 2012-01-19T18:13:43.053 回答