【问题标题】:ASP.NET Core 2 IFormCollection returning StringValuesASP.NET Core 2 IFormCollection 返回 StringValues
【发布时间】:2018-06-28 17:13:39
【问题描述】:

最近,我正在构建的平台中的 IFormCollection 开始返回 Microsoft.Extensions.Primitives.StringValues 类型的值。当它用于返回字符串时。 控制器是在考虑字符串的情况下制作的,现在有很多形式不起作用。

对此有什么解释,或者有办法恢复吗?

【问题讨论】:

  • 你能分享你的代码吗?另外,您是否添加了带有 POST 和 PUT 请求的输入参数的 [FromBody] 属性?

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


【解决方案1】:

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

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

【讨论】:

  • 值得注意的是,对于使用不显眼的验证的非常复杂和动态的表单,模型投标可能是一个挑战,因此 IFormCollection 可以提供一种简单的方法来查看表单发布上的所有数据
  • 我已经在一个表单帖子中处理了非常大的对象层次结构。模型绑定总是更好。无论如何,您都必须将这些数据解包到某种对象中才能对它做任何有用的事情。也可以让框架为您处理,这样您就可以专注于业务端。
【解决方案2】:

对于其他来这里的人,看到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
}

替代。

var name = collection.TryGetValue("name", out var names) ? names[0] : "John Doe";

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多