Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取列表的值<;T>;在自定义IValueProvider ASP.NET MVC 5.2.3中_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# 获取列表的值<;T>;在自定义IValueProvider ASP.NET MVC 5.2.3中

C# 获取列表的值<;T>;在自定义IValueProvider ASP.NET MVC 5.2.3中,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,在为这个问题挣扎了将近两天之后,我决定来这里问这个问题——我会尽我所能把问题弄清楚 首先,我想做的很简单:实现一个自定义的IValueProvider,它可以在ASP.NET MVC控制器中解密操作的参数——这部分已经完成,并且工作得很好;我的问题开始于当我在操作参数中有一个列表时,因为我无法从请求上下文中精确地确定这个列表的值 让我们一步一步来 首先,我有一个属性来装饰所需的操作: public class EncryptedQueryStringValuesAttribute : Filte

在为这个问题挣扎了将近两天之后,我决定来这里问这个问题——我会尽我所能把问题弄清楚

首先,我想做的很简单:实现一个自定义的IValueProvider,它可以在ASP.NET MVC控制器中解密操作的参数——这部分已经完成,并且工作得很好;我的问题开始于当我在操作参数中有一个列表时,因为我无法从请求上下文中精确地确定这个列表的值

让我们一步一步来

首先,我有一个属性来装饰所需的操作:

public class EncryptedQueryStringValuesAttribute : FilterAttribute, IAuthorizationFilter
{
    /// <summary>
    /// Called when authorization is required.
    /// </summary>
    /// <param name="filterContext">The filter context.</param>
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        filterContext.Controller.ValueProvider = new EncryptedQueryStringValuesProvider(
            filterContext.RequestContext, filterContext.ActionDescriptor);
    }
}
正如我所说的,这给了我正确的值

现在,丑陋的部分来了,
GetValue
方法:

public ValueProviderResult GetValue(string key)
{
    string[] rawValue = this.requestContext.HttpContext.Request.Params.GetValues(key);
    string attemptedValue = this.requestContext.HttpContext.Request.Params[key];
    return new ValueProviderResult(rawValue, attemptedValue, CultureInfo.CurrentCulture);
}
现在提取的
rawValue
为null,逻辑上为null,因为在我的请求中没有具有该名称的键-我所拥有的只是这样一个集合:

public bool ContainsPrefix(string prefix)
{
    return this.prefixContainer.Value.ContainsPrefix(prefix);
}
[25]: "SupplierInvoices[x].PaymentToInvoiceExchangeRate"
[26]: "SupplierInvoices[x].AmountToPayOnGivenInvoice"
[27]: "SupplierInvoices[x].OpenInvoiceId"
[28]: "SupplierInvoices[x].OpenInvoiceTimestamp"
filterContext.Controller.ValueProvider = new EncryptedQueryStringValuesProvider(filterContext.RequestContext, filterContext.ActionDescriptor);
另一方面,我完全知道我必须使用
this.prefixContainer.Value.GetKeysFromPrefix(prefix)构造以获取我请求中的所有键,并基于此,以某种方式连接这些键并将它们返回给ValueProviderResult,但不知道如何!:-)

请找个人解释如何将这些值连接起来,以便传递回ValueProviderResult以正确解释


谢谢大家!

在与这个问题斗争了几周之后,我决定改变方法,尽量不重新发明轮子。首先,我应该删除所有与收集处理相关的内容以及所有这些内容-因此关于
this.prefixContainer
的所有内容都应该删除-如果我在HTTPContext中找不到简单密钥,我不应该处理它,而将其留给其他提供者

还有一个问题-我如何“告诉”我的价值提供者“放手”一个键???最初我认为,如果在
containsRefix
方法中返回false,处理将切换到队列中的下一个
IValueProvider
,情况并非如此,
containsRefix
方法都应返回null,甚至更多,
GetValue
方法应返回null,只有在这些情况下,处理才会移动到下一个
IValueProvider

好的-现在我已经准备好了所有这些东西,如果没有
ValueProviderFactory
全局注册,我如何使用我的值提供程序,因为正如我所说的,处理只针对使用给定属性“签名”的操作进行。答案是这样的-而不是使用如下属性代码在
控制器中实例化自定义
值提供程序

public bool ContainsPrefix(string prefix)
{
    return this.prefixContainer.Value.ContainsPrefix(prefix);
}
[25]: "SupplierInvoices[x].PaymentToInvoiceExchangeRate"
[26]: "SupplierInvoices[x].AmountToPayOnGivenInvoice"
[27]: "SupplierInvoices[x].OpenInvoiceId"
[28]: "SupplierInvoices[x].OpenInvoiceTimestamp"
filterContext.Controller.ValueProvider = new EncryptedQueryStringValuesProvider(filterContext.RequestContext, filterContext.ActionDescriptor);
我必须将我的价值提供者添加到列表的顶部:

ValueProviderCollection valueProviderCollection = filterContext.Controller.ValueProvider as ValueProviderCollection;
if (valueProviderCollection == null)
throw new NullReferenceException("filterContext.Controller.ValueProvider as ValueProviderCollection");

valueProviderCollection.Insert(0, new EncryptedQueryStringValuesProvider(filterContext.RequestContext, filterContext.ActionDescriptor));
我希望这会对某人有所帮助。:-)