gpt4 book ai didi

c# - 如何在 asp.net core web api 中绑定(bind) Json 查询字符串

转载 作者:太空狗 更新时间:2023-10-29 21:32:24 24 4
gpt4 key购买 nike

asp.net web API 中的以下代码工作正常但在 Asp.net core 中不起作用。

端点api/devices?query={"deviceName":"example"}

[HttpGet]
public Device ([FromUri] string deviceName)
{
var device = context.Computers.Where(x => x.deviceName == deviceName);
return device;
}

[FromUri] 属性不存在 asp.net 核心网络 API,我尝试使用以下,但没有成功。

[HttpGet]
public Device Get([FromQuery] string deviceName)
{
return repo.GetDeviceByName(deviceName);
}

最佳答案

不幸的是,没有办法像您那样在 GET 查询中绑定(bind) JSON。您正在寻找的是使用自定义模型绑定(bind)器来告诉 ASP.net Core 您要如何绑定(bind)。

首先,您要为 JSON 对象构建模型。

public class MyCustomModel
{
public string DeviceName { get; set; }
}

接下来您需要构建您的模型 Binder 。下面给出了一个简单的示例,但您显然需要其他检查是否可以转换、Try/Catch block 等。本质上,模型绑定(bind)器告诉 ASP.net Core 应该如何绑定(bind)模型。您可能还会遇到给定类型的 TypeConverter,我如何在模型绑定(bind)期间将其更改为另一种类型。现在让我们只使用模型绑定(bind)器。

public class MyViewModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var jsonString = bindingContext.ActionContext.HttpContext.Request.Query["query"];
MyCustomModel result = JsonConvert.DeserializeObject<MyCustomModel>(jsonString);

bindingContext.Result = ModelBindingResult.Success(result);
return Task.CompletedTask;
}
}

所以我们所做的就是获取查询字符串并将其反序列化到我们的模型中。

接下来我们构建一个提供者。提供者告诉 ASP.net Core 使用哪个模型绑定(bind)器。在我们的例子中很简单,如果模型类型是我们的自定义类型,那么使用我们的自定义 Binder 。

public class MyViewModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context.Metadata.ModelType == typeof(MyCustomModel))
return new MyViewModelBinder();

return null;
}
}

最后一 block 拼图。在我们的 startup.cs 中,我们找到添加 MVC 服务的位置,并将我们的模型绑定(bind)器插入到列表的前面。这个很重要。如果我们只是将我们的模型绑定(bind)器添加到列表中,另一个模型绑定(bind)器可能会认为应该使用它(先到先得),所以我们可能永远不会进入我们的模型绑定(bind)器。所以一定要在开头插入。

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(config => config.ModelBinderProviders.Insert(0, new MyViewModelBinderProvider()));
}

现在我们只需创建一个读取数据的操作,不需要任何属性。

[HttpGet]
public void Get(MyCustomModel model)
{

}

进一步阅读:

关于c# - 如何在 asp.net core web api 中绑定(bind) Json 查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44607960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com