ASP.NET Core 2 IFormCollection返回StringValues

时间:2018-06-28 17:13:40

标签: asp.net asp.net-core asp.net-core-2.0

最近,我正在构建的平台中的IFormCollection开始返回Microsoft.Extensions.Primitives.StringValues类型的值。用于返回字符串时。 控制器是在考虑字符串的情况下制成的,现在,许多形式都无法使用。

对此有任何解释或恢复方法吗?

2 个答案:

答案 0 :(得分:0)

据我所知,ASP.NET Core的IFormCollection一直是StringValues的集合。原因很简单:可以为任何特定键发布多个值,如果类型仅为 string ,则可能无法设置该值。没有办法“还原”此内容。相应地更改代码。

或者更好的是,停止使用IFormCollection 。绑定到强类型模型。永远是最好的方法。

答案 1 :(得分:0)

对于来到这里的其他人,也看到IFormCollectionStringValues而感到困惑。您可能熟悉提供字符串的.NET Frameworks FormCollection类。更改的原因是有效的,@ Chris Pratt在此处的回答中对此做了解释。

要使IFormCollectionStringValues再次感到熟悉,请考虑以下任何简单扩展名:

// 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";