最近,我正在构建的平台中的IFormCollection开始返回Microsoft.Extensions.Primitives.StringValues类型的值。用于返回字符串时。 控制器是在考虑字符串的情况下制成的,现在,许多形式都无法使用。
对此有任何解释或恢复方法吗?
答案 0 :(得分:0)
据我所知,ASP.NET Core的IFormCollection
一直是StringValues
的集合。原因很简单:可以为任何特定键发布多个值,如果类型仅为 string ,则可能无法设置该值。没有办法“还原”此内容。相应地更改代码。
或者更好的是,停止使用IFormCollection
。绑定到强类型模型。永远是最好的方法。
答案 1 :(得分:0)
对于来到这里的其他人,也看到IFormCollection
给StringValues
而感到困惑。您可能熟悉提供字符串的.NET Frameworks FormCollection
类。更改的原因是有效的,@ Chris Pratt在此处的回答中对此做了解释。
要使IFormCollection
和StringValues
再次感到熟悉,请考虑以下任何简单扩展名:
// Example: var name = collection["name"].FirstOrNull();
// Equal to (.NET Framework): var name = collection["name"];
public static string FirstOrNull(this StringValues values)
{
if (values.Count > 0)
{
return values[0];
}
return null;
}
// Example: var name = collection["name"].FirstOr("John Doe");
// Equal to (.NET Framework): var name = collection["name"] ?? "John Doe";
public static string FirstOr(this StringValues values, string fallback)
{
if (values.Count > 0)
{
return values[0];
}
return fallback;
}
// Example: var name = collection.ValueOrFallback("name", "John Doe");
// Equal to (.NET Framework): var name = collection["name"] ?? "John Doe";
public static string ValueOrFallback(this IFormCollection collection, string key, string fallback)
{
if (collection["key"].Count > 0)
{
return collection["key"][0];
}
return fallback;
}
还要考虑内置的TryGetValue
:
if (collection.TryGetValue("name", out var name))
{
// at least one name did exist
}
Alt。
var name = collection.TryGetValue("name", out var names) ? names[0] : "John Doe";