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