【问题标题】:BindAttribute doesn't seem to work in ASP.Net MVC Core (2.0.8)BindAttribute 似乎在 ASP.Net MVC Core (2.0.8) 中不起作用
【发布时间】:2018-11-06 23:43:16
【问题描述】:

我正在尝试使用 Bind 属性在我的模型中仅包含特定属性。我知道我可以使用视图模型并且只指定我需要的属性,但我不能使用它,因为代码必须运行一些静态代码分析,如果 Bind 属性不存在会触发错误,我可以'不要改变那个规则(它不受我控制)。

这是我尝试过的。

型号:

[Bind("One")]
public class SomeModel 
{
    public int One { get; set; }
    public int Two { get; set; }
}

控制器方法:

[HttpPost("foo")]
[Consumes("application/json")]
public IActionResult Foo([FromBody] SomeModel model)
{
    return Json(model);
}

我在 POST 中发送的内容:

{
    "One": 1,
    "Two": 2
}

我得到的回应:

{
    "One": 1,
    "Two": 2
}

我也尝试将[Bind] 属性放在控制器方法参数之前,但它不起作用。

所以,我遇到的问题是“二”仍然被分配了一个值,即使我明确告诉我只想绑定“一”。

我做错了吗?

【问题讨论】:

  • 删除 from body 属性,只在参数上使用绑定,看看是否有效
  • @Nkosi 谢谢,但我也试过了,但它不起作用。在那种情况下,我在两个属性中都得到 0,这意味着绑定根本不起作用。然后我尝试了更多组合(添加JsonProperty 属性,更改属性的大小写),但没有成功。
  • @asterite 是否满足JsonIgnore 的要求,例如` public class SomeModel { public int One { get;放; } [JsonIgnore] 公共 int 两个 { 获取;放; } } `,否则,我担心您将需要实现自己的自定义模型绑定 [docs.microsoft.com/en-us/aspnet/core/mvc/advanced/… ASP.NET Core 中的模型绑定)
  • 我认为该规则需要一个 Bind 属性,我无能为力。奇怪的是它不起作用...

标签: c# asp.net-core-mvc


【解决方案1】:

似乎[Bind] 不适用于 JSON,所以没有办法解决这个问题,至少对于我的用例而言。

请参阅:https://github.com/aspnet/Mvc/issues/8005https://github.com/aspnet/Mvc/issues/5731

【讨论】:

  • 使用JsonIgnore有什么问题吗? [Bind] 不适用于 Json 是因为将 application/json 转换为模型是由 JsonInputFormatter 实现的。作为我的测试,JsonIngore 只会将One 从请求映射到模型。
  • 问题在于政策。我们(客户)正在使用 Veracode Scan,这是他们的规则 ¯\_(ツ)_/¯ 。我可以使用JsonIgnore 或任何其他方法,但它会使 Veracode 扫描失败...
【解决方案2】:

当模型通过请求中的主体传递时,BindAttribute 似乎没有按预期工作。 当它通过 QueryString 传递时,它会按预期工作。

您可以使用以下示例代码对此进行测试:

这是模型:

[Bind(include: nameof(MinX))]
public class ValueModel
{
    [JsonProperty("min-x")]
    public string MinX { get; set; }

    [JsonProperty("min-y")]
    public string MinY { get; set; }
}

按预期工作的 API 方法:

[HttpGet()]
public ActionResult<string> Get([FromQuery] ValueModel value)
{
    return new OkObjectResult($"MinX={value.MinX}; MinY={value.MinY}");
}

[HttpPost]
public ActionResult Post([FromQuery]ValueModel value)
{
    return new OkObjectResult($"MinX={value.MinX}; MinY={value.MinY}");
}

无法按预期工作的 API 方法:

[HttpPost]
public ActionResult Post([FromBody]ValueModel value)
{
    return new OkObjectResult($"MinX={value.MinX}; MinY={value.MinY}");
}

【讨论】:

    【解决方案3】:

    [Bind] 属性必须在参数上。您不能在类级别定义它。 @Nkosi 的建议失败的原因是您仍然需要 [FromBody],因为您要发布 JSON。换句话说:

    [HttpPost("foo")]
    [Consumes("application/json")]
    public IActionResult Foo([FromBody][Bind("One")] SomeModel model)
    {
        return Json(model);
    }
    

    FWIW,无论是谁设置你的静态分析都是白痴,应该被反复地、充满活力地称为这样的人。

    【讨论】:

    • 谢谢,但不幸的是这不起作用(我在问题中提到我已经尝试过这种方法)。
    • BindAttribute 可以在类上声明。请参阅 MSDN:docs.microsoft.com/en-us/dotnet/api/…
    • @FrederikGheysels:你到底在说什么?链接的文档绝不意味着它可以在类上使用,您甚至都懒得链接到 right BindAttribute 文档(注意 System.Web 命名空间)。跨度>
    • 抱歉链接错误;这是正确的。 docs.microsoft.com/en-us/dotnet/api/… 注意 AttributeUsage 属性,它指定它可以应用于类和参数。
    • 但这并不意味着它实际上会一些事情。在这种情况下,OP 试图将其应用于模型类,这不会做任何事情。我从没想过要尝试,但有可能你可以将它应用到控制器类,但不知道你为什么会这样做。无论如何,你可以将它应用到一个类中这一事实并不意味着它实际上会在那里做任何有意义的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多