【发布时间】:2014-10-24 14:15:27
【问题描述】:
从原始字符串“Text=AB&C”开始,此值通过 HttpUtility.ParseQueryString 传递以创建 NameValueCollection。
然后为 TryUpdateModel 创建 IValueProvider,NameValueCollection 创建一个新的 NameValueCollectionProdvier。
此时在 NameValueCollectionValueProvider 中,Key 变为 Text,Value 仍保持 AB&C。
当调用 TryUpdateModel 并传入值时,Text 从 AB&C 变为 AB。
你有什么想法吗?
代码如下:
e 来自一个传递给控制器 ActionResult 模型值的 foreach
foreach (string e in model.Elements)
{
string queryString = HttpUtility.UrlDecode(e);
var model = new Model();
NameValueCollection nameValues = HttpUtility.ParseQueryString(queryString);
// nameValues = {Text=AB&C} at this point
var provider = new NameValueCollectionValueProvider(nameValues, System.Globalization.CultureInfo.CurrentUICulture);
// provider = NameValueCollectionValueProvider at this point
// It's _values has a Count=1
// which at index [0] has this value {[Text, System.Web.Mvc.NameValueCollectionProvider+ValueProviderResultPlaceholder]}
// which has a Key of "Text"
// and a Value of System.Web.Mvc.NameValueCollectionProvider
// within that Value, it's broken down with some properties
// System.Web.Mvc.NameValueCollectionProvider
// _validatedCollection and _unvalidatedCollection both have a value of Text=AB&C
// but I see now that the ValidatedResult and the UnvalidatedResult both have a value of AB
TryUpdateModel(model, provider);
模型的 Text 值声明为 public string Text { get; set; },因此 TryUpdateModel 会找到匹配的 Text 声明。
更新:
我发现在 NameValueCollectionValueProvider 中,提供者的值有一个 _unvalidatedCollection 和一个 _validatedCollection,我的预期结果是 Text=AB&C,但提供者中的 UnvalidatedResult 和 ValidatedResult 的值都是 AB。
似乎提供者正在删除 & 之后的值。
提供程序本身是否可以进一步编码以维护字符串中的 &?
【问题讨论】:
-
我认为
AB&C应该是 UrlEncoded ... -
我刚刚遇到了这个答案,听起来我对此无能为力,必须手动解析以维护我想要的“特殊”字符stackoverflow.com/a/4604759/1040188 除非有其他解决方案
标签: c# asp.net asp.net-mvc