C# ASP.NET MVC 5 TryUpdateModel不允许&;串
从原始字符串“Text=AB&C”开始,此值通过HttpUtility.ParseQueryString传递以创建NameValueCollection 然后,要为TryUpdateModel创建IValueProvider,NameValueCollection将创建一个新的NameValueCollectionProdvier 此时,在NameValueCollectionValueProvider中,键变成文本,值仍然保持AB&C 调用TryUpdateModel传递值时,文本从AB&C更改为AB 你有没有想过为什么会这样 代码如下: e来自传入控制器ActionResult模型值的foreachC# ASP.NET MVC 5 TryUpdateModel不允许&;串,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,从原始字符串“Text=AB&C”开始,此值通过HttpUtility.ParseQueryString传递以创建NameValueCollection 然后,要为TryUpdateModel创建IValueProvider,NameValueCollection将创建一个新的NameValueCollectionProdvier 此时,在NameValueCollectionValueProvider中,键变成文本,值仍然保持AB&C 调用TryUpdateModel传递值时,文本从AB&C更
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);
模型的文本值声明为公共字符串文本{get;set;}
,因此TryUpdateModel不会找到匹配的文本声明
更新:
我发现在NameValueCollectionValueProvider中,提供程序的值有一个_unvalidatedCollection和一个_validatedCollection,预期结果为Text=AB&C,但提供程序中的UnvalidatedResult和ValidatedResult的值都是AB
似乎提供程序正在删除&之后的值
提供程序本身是否可以进一步编码以保持字符串中的&值?在构建url时需要编码,在尝试读取url参数时需要解码
string queryString=“Text=”+HttpUtility.UrlEncode(“AB&C”)
我认为AB&C
应该是URL编码的…我刚刚遇到了这个答案,听起来我对此无能为力,必须手动解析以维护我想要的“特殊”字符,除非有另一个解决方案,这已经在编码之后了。原始字符串作为AB%26C传入。编码后,值变为AB&C。只有在TryUpdateModel期间,&之后的字符才会被删除。我想保留文本中的-,我想你的意思是在解码后,我不认为你的问题在TryUpdateModel,它应该在NameValueCollection nameValues=HttpUtility.ParseQueryString(queryString);它应该是解析文本AB。试着用“Text=AB&C=y”,它会给你文本AB和C,y。您的代码将C作为查询字符串上的第二个变量。我理解您的意思,即NameValueCollection将&视为查询字符串上的第二个变量。谢谢