在ASP.NET中,可以使用路由模型绑定来直接将URL段绑定到指定的模型上,从而简化控制器的代码。下面是利用ASP.NET EF实现路由模型绑定的示例代码:
services.AddMvc(options => { options.ModelBinderProviders.Insert(0, new RouteDataModelBinderProvider()); });
public class RouteDataModelBinder : IModelBinder { public async Task BindModelAsync(ModelBindingContext bindingContext) { // 从路由数据中获取模型的ID值 var valueProviderResult = bindingContext.ValueProvider.GetValue("id"); if (valueProviderResult == ValueProviderResult.None) { // 如果未找到ID值,则返回失败 bindingContext.Result = ModelBindingResult.Failed(); return; }
// 将ID值转换为对应的模型对象
var id = valueProviderResult.FirstValue;
var dbContext = bindingContext.HttpContext.RequestServices.GetService();
var entity = await dbContext.Products.FindAsync(int.Parse(id));
if (entity == null)
{
// 如果未找到对应的模型对象,则返回失败
bindingContext.Result = ModelBindingResult.Failed();
return;
}
// 将模型对象绑定到模型上下文中
bindingContext.Result = ModelBindingResult.Success(entity);
}
}
public class RouteDataModelBinderProvider : IModelBinderProvider { public IModelBinder GetBinder(ModelBinderProviderContext context) { if (context.Metadata.ModelType == typeof(Product)) { return new RouteDataModelBinder(); }
return null;
}
}
[HttpGet("{id}")] public IActionResult Get(Product product) { return Ok(product