实现IModelBinder以进行字符串收集

时间:2019-05-07 09:33:29

标签: asp.net-mvc asp.net-core model-binding custom-model-binder

实际上,在我的.NET Core项目中,我使用的是简单的Modelbinder来修剪输入字符串

<style>
svg {
  width: 100px;
  display: block;
  margin: 40px auto 0;
}

.path {
  stroke-dasharray: 1000;
  stroke-dashoffset: 0;
  &.circle {
    -webkit-animation: dash .9s ease-in-out;
    animation: dash .9s ease-in-out;
  }
  &.line {
    stroke-dashoffset: 1000;
    -webkit-animation: dash .9s .35s ease-in-out forwards;
    animation: dash .9s .35s ease-in-out forwards;
  }
  &.check {
    stroke-dashoffset: -100;
    -webkit-animation: dash-check .9s .35s ease-in-out forwards;
    animation: dash-check .9s .35s ease-in-out forwards;
  }
}

p {
  text-align: center;
  margin: 20px 0 60px;
  font-size: 1.25em;
  &.success {
    color: #73AF55;
  }
  &.error {
    color: #D06079;
  }
}


@-webkit-keyframes dash {
  0% {
    stroke-dashoffset: 1000;
  }
  100% {
    stroke-dashoffset: 0;
  }
}

@keyframes dash {
  0% {
    stroke-dashoffset: 1000;
  }
  100% {
    stroke-dashoffset: 0;
  }
}

@-webkit-keyframes dash-check {
  0% {
    stroke-dashoffset: -100;
  }
  100% {
    stroke-dashoffset: 900;
  }
}

@keyframes dash-check {
  0% {
    stroke-dashoffset: -100;
  }
  100% {
    stroke-dashoffset: 900;
  }
}
</style>

我通过IModelBinderProvider使用它,它在输入字符串类型时非常有效。但是我注意到,当输入有这样的字符串集合时,它不会被触发

public class StringModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException(nameof(bindingContext));

        ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult != ValueProviderResult.None)
        {
            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);

            string valueAsString = string.IsNullOrWhiteSpace(valueAsString) ? null : valueAsString.Trim();

            bindingContext.Result = ModelBindingResult.Success(valueAsString);
        }

        return Task.CompletedTask;
    }
}

要执行此操作,我认为我应该使用类似的

public IActionResult CollectionTrimTest([FromBody] List<string> values)

但是我真的不知道如何实现CollectionModelBinder来基于字符串集合修剪结果。当然,将非常感谢在StringModelBinder和CollectionModelBinder之间集中修剪逻辑。

1 个答案:

答案 0 :(得分:0)

已解决,似乎[FromBody]必须需要一个JsonConverter。有关更多信息,请访问https://stackoverflow.com/a/54663595/4963176