【问题标题】:ASP.NET MVC 5 TryUpdateModel not allowing & in stringASP.NET MVC 5 TryUpdateModel 不允许字符串中的 &
【发布时间】: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


【解决方案1】:

在构建 url 时需要编码,在尝试读取 url 参数时需要解码 string queryString = "Text=" + HttpUtility.UrlEncode("AB&C");

【讨论】:

  • 这已经是编码后的了。原始字符串作为 AB%26C 传入。编码后值变为 AB&C。只有在 TryUpdateModel 期间 & 之后的字符才会被删除。我想在文本中保留 &。
  • 我认为你的意思是解码后,我不认为你的问题出在 TryUpdateModel,它应该在 NameValueCollection nameValues = HttpUtility.ParseQueryString(queryString);它应该解析文本,AB。试试“Text=AB&C=y”,它会给你Text,AB和C,y。您的代码将 C 作为查询字符串的第二个变量。
  • 我理解您的意思,NameValueCollection 将 & 视为查询字符串中的第二个变量。谢谢
猜你喜欢
  • 2021-01-23
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多