C# ASP.NET MVC 5 TryUpdateModel不允许&;串

C# 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更

从原始字符串“Text=AB&C”开始,此值通过HttpUtility.ParseQueryString传递以创建NameValueCollection

然后,要为TryUpdateModel创建IValueProvider,NameValueCollection将创建一个新的NameValueCollectionProdvier

此时,在NameValueCollectionValueProvider中,键变成文本,值仍然保持AB&C

调用TryUpdateModel传递值时,文本从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);
模型的文本值声明为
公共字符串文本{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将&视为查询字符串上的第二个变量。谢谢