From f22bb66b59a3c108cb942bd60f45be4fe7d1b3cd Mon Sep 17 00:00:00 2001 From: Kirk Larkin Date: Wed, 1 Jan 2020 15:22:10 +0000 Subject: [PATCH 1/3] 2.1 update. --- .../sample/CustomModelBindingSample/.bowerrc | 3 - .../Binders/AuthorEntityBinder.cs | 16 ++-- .../Controllers/AuthorsController.cs | 8 +- .../Controllers/BoundAuthorsController.cs | 19 +++-- .../Controllers/ImageController.cs | 20 ++--- .../CustomModelBindingSample.csproj | 18 +---- .../Data/AppDbContext.cs | 6 +- .../CustomModelBindingSample/Data/Author.cs | 4 - .../CustomModelBindingSample/Program.cs | 20 ++--- .../CustomModelBindingSample/Startup.cs | 18 +++-- .../Views/Shared/Error.cshtml | 14 ---- .../Views/Shared/_Layout.cshtml | 73 ------------------- .../Shared/_ValidationScriptsPartial.cshtml | 18 ----- .../Views/_ViewImports.cshtml | 2 - .../Views/_ViewStart.cshtml | 3 - .../CustomModelBindingSample/bower.json | 10 --- .../bundleconfig.json | 24 ------ 17 files changed, 51 insertions(+), 225 deletions(-) delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/.bowerrc delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/Error.cshtml delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/_Layout.cshtml delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/_ValidationScriptsPartial.cshtml delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/_ViewImports.cshtml delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/_ViewStart.cshtml delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/bower.json delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/bundleconfig.json diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/.bowerrc b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/.bowerrc deleted file mode 100644 index 6406626abfef..000000000000 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory": "wwwroot/lib" -} diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinder.cs b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinder.cs index 0d2791ec47a7..7708e81d3480 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinder.cs +++ b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinder.cs @@ -9,6 +9,7 @@ namespace CustomModelBindingSample.Binders public class AuthorEntityBinder : IModelBinder { private readonly AppDbContext _db; + public AuthorEntityBinder(AppDbContext db) { _db = db; @@ -22,18 +23,16 @@ public Task BindModelAsync(ModelBindingContext bindingContext) } var modelName = bindingContext.ModelName; - + // Try to fetch the value of the argument by name - var valueProviderResult = - bindingContext.ValueProvider.GetValue(modelName); + var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName); if (valueProviderResult == ValueProviderResult.None) { return Task.CompletedTask; } - bindingContext.ModelState.SetModelValue(modelName, - valueProviderResult); + bindingContext.ModelState.SetModelValue(modelName, valueProviderResult); var value = valueProviderResult.FirstValue; @@ -43,13 +42,12 @@ public Task BindModelAsync(ModelBindingContext bindingContext) return Task.CompletedTask; } - int id = 0; - if (!int.TryParse(value, out id)) + if (!int.TryParse(value, out var id)) { // Non-integer arguments result in model state errors bindingContext.ModelState.TryAddModelError( - modelName, - "Author Id must be an integer."); + modelName, "Author Id must be an integer."); + return Task.CompletedTask; } diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/AuthorsController.cs b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/AuthorsController.cs index d5d4d637c17a..0e0e26eeca3c 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/AuthorsController.cs +++ b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/AuthorsController.cs @@ -3,25 +3,27 @@ namespace CustomModelBindingSample.Controllers { - [Produces("application/json")] + [ApiController] [Route("api/[controller]")] public class AuthorsController : Controller { private readonly AppDbContext _db; + public AuthorsController(AppDbContext db) { _db = db; } - // GET: api/authors/1 [HttpGet("{id}")] public IActionResult GetById(int id) { var author = _db.Authors.Find(id); - if(author == null) + + if (author == null) { return NotFound(); } + return Ok(author); } } diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/BoundAuthorsController.cs b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/BoundAuthorsController.cs index 532ee19ef9f5..77c25f54a668 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/BoundAuthorsController.cs +++ b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/BoundAuthorsController.cs @@ -1,35 +1,34 @@ using Microsoft.AspNetCore.Mvc; using CustomModelBindingSample.Data; -using System.Linq; namespace CustomModelBindingSample.Controllers { - [Produces("application/json")] + [ApiController] [Route("api/[controller]")] - public class BoundAuthorsController : Controller + public class BoundAuthorsController : ControllerBase { - // GET: api/boundauthors/1 #region demo1 [HttpGet("{id}")] - public IActionResult GetById([ModelBinder(Name = "id")]Author author) + public IActionResult GetById([ModelBinder(Name = "id")] Author author) { if (author == null) { return NotFound(); } - if (!ModelState.IsValid) - { - return BadRequest(ModelState); - } + return Ok(author); } #endregion - // GET: api/boundauthors/get/1 #region demo2 [HttpGet("get/{authorId}")] public IActionResult Get(Author author) { + if (author == null) + { + return NotFound(); + } + return Ok(author); } #endregion diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/ImageController.cs b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/ImageController.cs index 186b1addb855..8261e63b4fc1 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/ImageController.cs +++ b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/ImageController.cs @@ -1,28 +1,24 @@ using System.IO; -using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; namespace CustomModelBindingSample.Controllers { - [Produces("application/json")] - [Route("api/Image")] - public class ImageController : Controller + [ApiController] + [Route("api/[controller]")] + public class ImageController : ControllerBase { - private readonly IHostingEnvironment _env; private readonly string _targetFilePath; - public ImageController(IHostingEnvironment env, IConfiguration config) + public ImageController(IConfiguration config) { - _env = env; - _targetFilePath = config.GetValue("StoredFilesPath"); + _targetFilePath = config["StoredFilesPath"]; } #region post1 - // POST: api/image [HttpPost] - public void Post(byte[] file, string filename) + public void Post([FromForm] byte[] file, string filename) { // Don't trust the file name sent by the client. Use // Path.GetRandomFileName to generate a safe random @@ -43,7 +39,7 @@ public void Post(byte[] file, string filename) #region post2 [HttpPost("Profile")] - public void SaveProfile(ProfileViewModel model) + public void SaveProfile([FromForm] ProfileViewModel model) { // Don't trust the file name sent by the client. Use // Path.GetRandomFileName to generate a safe random @@ -52,7 +48,7 @@ public void SaveProfile(ProfileViewModel model) // the sample app). var trustedFileName = Path.GetRandomFileName(); var filePath = Path.Combine(_targetFilePath, trustedFileName); - + if (System.IO.File.Exists(filePath)) { return; diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/CustomModelBindingSample.csproj b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/CustomModelBindingSample.csproj index a072d9c97868..2a54222f62d6 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/CustomModelBindingSample.csproj +++ b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/CustomModelBindingSample.csproj @@ -1,21 +1,9 @@  - - netcoreapp1.0 + netcoreapp2.1 - - - $(PackageTargetFallback);portable-net45+win8+wp8+wpa81; - - - - - - - - - + + - diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/AppDbContext.cs b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/AppDbContext.cs index 87faae61413d..06bb6c8cc8f7 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/AppDbContext.cs +++ b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/AppDbContext.cs @@ -4,9 +4,9 @@ namespace CustomModelBindingSample.Data { public class AppDbContext : DbContext { + public AppDbContext(DbContextOptions options) + : base(options) { } + public DbSet Authors { get; set; } - public AppDbContext(DbContextOptions options) : base(options) - { - } } } diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/Author.cs b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/Author.cs index 0bfea3ad5c48..d77d47e5d6f8 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/Author.cs +++ b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/Author.cs @@ -1,9 +1,5 @@ using CustomModelBindingSample.Binders; using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; namespace CustomModelBindingSample.Data { diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Program.cs b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Program.cs index 7985a2c3159d..9e2c99dc969f 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Program.cs +++ b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Program.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; +using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; namespace CustomModelBindingSample @@ -11,15 +7,11 @@ public class Program { public static void Main(string[] args) { - var host = new WebHostBuilder() - .UseKestrel() - .UseContentRoot(Directory.GetCurrentDirectory()) - .UseIISIntegration() - .UseStartup() - .UseApplicationInsights() - .Build(); - - host.Run(); + CreateWebHostBuilder(args).Build().Run(); } + + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup(); } } diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Startup.cs b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Startup.cs index 3ef1d4d012b7..9b0cbbba98ac 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Startup.cs +++ b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Startup.cs @@ -1,6 +1,7 @@ using CustomModelBindingSample.Binders; using CustomModelBindingSample.Data; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; @@ -8,17 +9,18 @@ namespace CustomModelBindingSample { public class Startup { - #region callout public void ConfigureServices(IServiceCollection services) { - services.AddDbContext(options => options.UseInMemoryDatabase()); + services.AddDbContext(options => options.UseInMemoryDatabase("App")); - services.AddMvc(options => - { - // add custom binder to beginning of collection - options.ModelBinderProviders.Insert(0, new AuthorEntityBinderProvider()); - }); + services + .AddMvc(options => + { + // add custom binder to beginning of collection + options.ModelBinderProviders.Insert(0, new AuthorEntityBinderProvider()); + }) + .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); } #endregion @@ -37,4 +39,4 @@ private void PopulateTestData(AppDbContext db) db.SaveChanges(); } } -} \ No newline at end of file +} diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/Error.cshtml b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/Error.cshtml deleted file mode 100644 index e514139c454a..000000000000 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/Error.cshtml +++ /dev/null @@ -1,14 +0,0 @@ -@{ - ViewData["Title"] = "Error"; -} - -

Error.

-

An error occurred while processing your request.

- -

Development Mode

-

- Swapping to Development environment will display more detailed information about the error that occurred. -

-

- Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application. -

diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/_Layout.cshtml b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/_Layout.cshtml deleted file mode 100644 index 6cbfb9d41493..000000000000 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/_Layout.cshtml +++ /dev/null @@ -1,73 +0,0 @@ -@inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet - - - - - - @ViewData["Title"] - CustomModelBindingSample - - - - - - - - - - @Html.Raw(JavaScriptSnippet.FullScript) - - - -
- @RenderBody() -
-
-

© 2017 - CustomModelBindingSample

-
-
- - - - - - - - - - - - - @RenderSection("Scripts", required: false) - - diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/_ValidationScriptsPartial.cshtml b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/_ValidationScriptsPartial.cshtml deleted file mode 100644 index 27e0ea7ce2f1..000000000000 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/Shared/_ValidationScriptsPartial.cshtml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/_ViewImports.cshtml b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/_ViewImports.cshtml deleted file mode 100644 index 2aeabedc2c80..000000000000 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/_ViewImports.cshtml +++ /dev/null @@ -1,2 +0,0 @@ -@using CustomModelBindingSample -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/_ViewStart.cshtml b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/_ViewStart.cshtml deleted file mode 100644 index a5f10045db97..000000000000 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Views/_ViewStart.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@{ - Layout = "_Layout"; -} diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/bower.json b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/bower.json deleted file mode 100644 index b07e3cc5ae5d..000000000000 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/bower.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "asp.net", - "private": true, - "dependencies": { - "bootstrap": "3.3.7", - "jquery": "2.2.0", - "jquery-validation": "1.14.0", - "jquery-validation-unobtrusive": "3.2.6" - } -} diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/bundleconfig.json b/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/bundleconfig.json deleted file mode 100644 index 6d3f9a57aea2..000000000000 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/bundleconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -// Configure bundling and minification for the project. -// More info at https://go.microsoft.com/fwlink/?LinkId=808241 -[ - { - "outputFileName": "wwwroot/css/site.min.css", - // An array of relative input file paths. Globbing patterns supported - "inputFiles": [ - "wwwroot/css/site.css" - ] - }, - { - "outputFileName": "wwwroot/js/site.min.js", - "inputFiles": [ - "wwwroot/js/site.js" - ], - // Optionally specify minification options - "minify": { - "enabled": true, - "renameLocals": true - }, - // Optionally generate .map file - "sourceMap": false - } -] From 7c9cb5d1788b0451f8cc9161607ea6de911ebb3d Mon Sep 17 00:00:00 2001 From: Kirk Larkin Date: Wed, 1 Jan 2020 15:33:51 +0000 Subject: [PATCH 2/3] Moved to samples/2.x. --- .../mvc/advanced/custom-model-binding.md | 22 +++++++++---------- .../CustomModelBindingSample/Base64String.txt | 0 .../Binders/AuthorEntityBinder.cs | 0 .../Binders/AuthorEntityBinderProvider.cs | 0 .../Controllers/AuthorsController.cs | 0 .../Controllers/BoundAuthorsController.cs | 0 .../Controllers/ImageController.cs | 0 .../CustomModelBindingSample.csproj | 0 .../Data/AppDbContext.cs | 0 .../CustomModelBindingSample/Data/Author.cs | 0 .../2.x}/CustomModelBindingSample/Program.cs | 0 .../2.x}/CustomModelBindingSample/README.md | 0 .../2.x}/CustomModelBindingSample/Startup.cs | 5 ++--- .../appsettings.Development.json | 0 .../CustomModelBindingSample/appsettings.json | 0 15 files changed, 13 insertions(+), 14 deletions(-) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Base64String.txt (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Binders/AuthorEntityBinder.cs (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Binders/AuthorEntityBinderProvider.cs (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Controllers/AuthorsController.cs (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Controllers/BoundAuthorsController.cs (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Controllers/ImageController.cs (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/CustomModelBindingSample.csproj (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Data/AppDbContext.cs (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Data/Author.cs (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Program.cs (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/README.md (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/Startup.cs (93%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/appsettings.Development.json (100%) rename aspnetcore/mvc/advanced/custom-model-binding/{sample => samples/2.x}/CustomModelBindingSample/appsettings.json (100%) diff --git a/aspnetcore/mvc/advanced/custom-model-binding.md b/aspnetcore/mvc/advanced/custom-model-binding.md index b3e0c55d5b3f..2bb13dfb87f8 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding.md +++ b/aspnetcore/mvc/advanced/custom-model-binding.md @@ -3,7 +3,7 @@ title: Custom Model Binding in ASP.NET Core author: ardalis description: Learn how model binding allows controller actions to work directly with model types in ASP.NET Core. ms.author: riande -ms.date: 12/05/2019 +ms.date: 01/01/2020 uid: mvc/advanced/custom-model-binding --- # Custom Model Binding in ASP.NET Core @@ -34,7 +34,7 @@ A small portion of the encoded string is shown in the following image: ![dotnet bot encoded](custom-model-binding/images/encoded-bot.png "dotnet bot encoded") -Follow the instructions in the [sample's README](https://github.com/aspnet/AspNetCore.Docs/blob/master/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/README.md) to convert the base64-encoded string into a file. +Follow the instructions in the [sample's README](https://github.com/aspnet/AspNetCore.Docs/blob/master/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/README.md) to convert the base64-encoded string into a file. ASP.NET Core MVC can take a base64-encoded string and use a `ByteArrayModelBinder` to convert it into a byte array. The [ByteArrayModelBinderProvider](/dotnet/api/microsoft.aspnetcore.mvc.modelbinding.binders.bytearraymodelbinderprovider) which implements [IModelBinderProvider](/dotnet/api/microsoft.aspnetcore.mvc.modelbinding.imodelbinderprovider) maps `byte[]` arguments to `ByteArrayModelBinder`: @@ -59,7 +59,7 @@ When creating your own custom model binder, you can implement your own `IModelBi The following example shows how to use `ByteArrayModelBinder` to convert a base64-encoded string to a `byte[]` and save the result to a file: -[!code-csharp[](custom-model-binding/sample/CustomModelBindingSample/Controllers/ImageController.cs?name=post1&highlight=3)] +[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/ImageController.cs?name=post1&highlight=3)] You can POST a base64-encoded string to this api method using a tool like [Postman](https://www.getpostman.com/): @@ -67,7 +67,7 @@ You can POST a base64-encoded string to this api method using a tool like [Postm As long as the binder can bind request data to appropriately named properties or arguments, model binding will succeed. The following example shows how to use `ByteArrayModelBinder` with a view model: -[!code-csharp[](custom-model-binding/sample/CustomModelBindingSample/Controllers/ImageController.cs?name=post2&highlight=2)] +[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/ImageController.cs?name=post2&highlight=2)] ## Custom model binder sample @@ -79,24 +79,24 @@ In this section we'll implement a custom model binder that: The following sample uses the `ModelBinder` attribute on the `Author` model: -[!code-csharp[](custom-model-binding/sample/CustomModelBindingSample/Data/Author.cs?highlight=10)] +[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Data/Author.cs?highlight=6)] In the preceding code, the `ModelBinder` attribute specifies the type of `IModelBinder` that should be used to bind `Author` action parameters. The following `AuthorEntityBinder` class binds an `Author` parameter by fetching the entity from a data source using Entity Framework Core and an `authorId`: -[!code-csharp[](custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinder.cs?name=demo)] +[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Binders/AuthorEntityBinder.cs?name=demo)] > [!NOTE] > The preceding `AuthorEntityBinder` class is intended to illustrate a custom model binder. The class isn't intended to illustrate best practices for a lookup scenario. For lookup, bind the `authorId` and query the database in an action method. This approach separates model binding failures from `NotFound` cases. The following code shows how to use the `AuthorEntityBinder` in an action method: -[!code-csharp[](custom-model-binding/sample/CustomModelBindingSample/Controllers/BoundAuthorsController.cs?name=demo2&highlight=2)] +[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/BoundAuthorsController.cs?name=demo2&highlight=2)] The `ModelBinder` attribute can be used to apply the `AuthorEntityBinder` to parameters that don't use default conventions: -[!code-csharp[](custom-model-binding/sample/CustomModelBindingSample/Controllers/BoundAuthorsController.cs?name=demo1&highlight=2)] +[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/BoundAuthorsController.cs?name=demo1&highlight=2)] In this example, since the name of the argument isn't the default `authorId`, it's specified on the parameter using the `ModelBinder` attribute. Both the controller and action method are simplified compared to looking up the entity in the action method. The logic to fetch the author using Entity Framework Core is moved to the model binder. This can be a considerable simplification when you have several methods that bind to the `Author` model. @@ -106,14 +106,14 @@ You can apply the `ModelBinder` attribute to individual model properties (such a Instead of applying an attribute, you can implement `IModelBinderProvider`. This is how the built-in framework binders are implemented. When you specify the type your binder operates on, you specify the type of argument it produces, **not** the input your binder accepts. The following binder provider works with the `AuthorEntityBinder`. When it's added to MVC's collection of providers, you don't need to use the `ModelBinder` attribute on `Author` or `Author`-typed parameters. -[!code-csharp[](custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinderProvider.cs?highlight=17-20)] +[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Binders/AuthorEntityBinderProvider.cs?highlight=17-20)] > Note: > The preceding code returns a `BinderTypeModelBinder`. `BinderTypeModelBinder` acts as a factory for model binders and provides dependency injection (DI). The `AuthorEntityBinder` requires DI to access EF Core. Use `BinderTypeModelBinder` if your model binder requires services from DI. To use a custom model binder provider, add it in `ConfigureServices`: -[!code-csharp[](custom-model-binding/sample/CustomModelBindingSample/Startup.cs?name=callout&highlight=5-9)] +[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Startup.cs?name=snippet_ConfigureServices&highlight=5-10)] When evaluating model binders, the collection of providers is examined in order. The first provider that returns a binder is used. @@ -123,7 +123,7 @@ The following image shows the default model binders from the debugger. Adding your provider to the end of the collection may result in a built-in model binder being called before your custom binder has a chance. In this example, the custom provider is added to the beginning of the collection to ensure it's used for `Author` action arguments. -[!code-csharp[](custom-model-binding/sample/CustomModelBindingSample/Startup.cs?name=callout&highlight=5-9)] +[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Startup.cs?name=snippet_ConfigureServices&highlight=5-10)] ### Polymorphic model binding diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Base64String.txt b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Base64String.txt similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Base64String.txt rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Base64String.txt diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinder.cs b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Binders/AuthorEntityBinder.cs similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinder.cs rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Binders/AuthorEntityBinder.cs diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinderProvider.cs b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Binders/AuthorEntityBinderProvider.cs similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Binders/AuthorEntityBinderProvider.cs rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Binders/AuthorEntityBinderProvider.cs diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/AuthorsController.cs b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/AuthorsController.cs similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/AuthorsController.cs rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/AuthorsController.cs diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/BoundAuthorsController.cs b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/BoundAuthorsController.cs similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/BoundAuthorsController.cs rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/BoundAuthorsController.cs diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/ImageController.cs b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/ImageController.cs similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Controllers/ImageController.cs rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Controllers/ImageController.cs diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/CustomModelBindingSample.csproj b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/CustomModelBindingSample.csproj similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/CustomModelBindingSample.csproj rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/CustomModelBindingSample.csproj diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/AppDbContext.cs b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Data/AppDbContext.cs similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/AppDbContext.cs rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Data/AppDbContext.cs diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/Author.cs b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Data/Author.cs similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Data/Author.cs rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Data/Author.cs diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Program.cs b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Program.cs similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Program.cs rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Program.cs diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/README.md b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/README.md similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/README.md rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/README.md diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Startup.cs b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Startup.cs similarity index 93% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Startup.cs rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Startup.cs index 9b0cbbba98ac..d8578929865b 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/Startup.cs +++ b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/Startup.cs @@ -9,13 +9,12 @@ namespace CustomModelBindingSample { public class Startup { - #region callout + #region snippet_ConfigureServices public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => options.UseInMemoryDatabase("App")); - services - .AddMvc(options => + services.AddMvc(options => { // add custom binder to beginning of collection options.ModelBinderProviders.Insert(0, new AuthorEntityBinderProvider()); diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/appsettings.Development.json b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/appsettings.Development.json similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/appsettings.Development.json rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/appsettings.Development.json diff --git a/aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/appsettings.json b/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/appsettings.json similarity index 100% rename from aspnetcore/mvc/advanced/custom-model-binding/sample/CustomModelBindingSample/appsettings.json rename to aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/appsettings.json From 3da68966604ae33da24ced5d09ab5e27d9a4afb7 Mon Sep 17 00:00:00 2001 From: Kirk Larkin Date: Wed, 1 Jan 2020 15:44:13 +0000 Subject: [PATCH 3/3] A few edits to the topic itself. --- .../mvc/advanced/custom-model-binding.md | 28 ++++-------------- .../custom-model-binding/images/bot.png | Bin 14962 -> 0 bytes .../images/default-model-binders.png | Bin 7038 -> 0 bytes .../images/encoded-bot.png | Bin 37335 -> 0 bytes 4 files changed, 6 insertions(+), 22 deletions(-) delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/images/bot.png delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/images/default-model-binders.png delete mode 100644 aspnetcore/mvc/advanced/custom-model-binding/images/encoded-bot.png diff --git a/aspnetcore/mvc/advanced/custom-model-binding.md b/aspnetcore/mvc/advanced/custom-model-binding.md index 2bb13dfb87f8..c9474cd42832 100644 --- a/aspnetcore/mvc/advanced/custom-model-binding.md +++ b/aspnetcore/mvc/advanced/custom-model-binding.md @@ -22,21 +22,13 @@ The default model binders support most of the common .NET Core data types and sh Model binding uses specific definitions for the types it operates on. A *simple type* is converted from a single string in the input. A *complex type* is converted from multiple input values. The framework determines the difference based on the existence of a `TypeConverter`. We recommended you create a type converter if you have a simple `string` -> `SomeType` mapping that doesn't require external resources. -Before creating your own custom model binder, it's worth reviewing how existing model binders are implemented. Consider the [ByteArrayModelBinder](/dotnet/api/microsoft.aspnetcore.mvc.modelbinding.binders.bytearraymodelbinder) which can be used to convert base64-encoded strings into byte arrays. The byte arrays are often stored as files or database BLOB fields. +Before creating your own custom model binder, it's worth reviewing how existing model binders are implemented. Consider the which can be used to convert base64-encoded strings into byte arrays. The byte arrays are often stored as files or database BLOB fields. ### Working with the ByteArrayModelBinder -Base64-encoded strings can be used to represent binary data. For example, the following image can be encoded as a string. +Base64-encoded strings can be used to represent binary data. For example, an image can be encoded as a string. Follow the instructions in the [sample's README](https://github.com/aspnet/AspNetCore.Docs/blob/master/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/README.md) to convert a base64-encoded string into a file. -![dotnet bot](custom-model-binding/images/bot.png "dotnet bot") - -A small portion of the encoded string is shown in the following image: - -![dotnet bot encoded](custom-model-binding/images/encoded-bot.png "dotnet bot encoded") - -Follow the instructions in the [sample's README](https://github.com/aspnet/AspNetCore.Docs/blob/master/aspnetcore/mvc/advanced/custom-model-binding/samples/2.x/CustomModelBindingSample/README.md) to convert the base64-encoded string into a file. - -ASP.NET Core MVC can take a base64-encoded string and use a `ByteArrayModelBinder` to convert it into a byte array. The [ByteArrayModelBinderProvider](/dotnet/api/microsoft.aspnetcore.mvc.modelbinding.binders.bytearraymodelbinderprovider) which implements [IModelBinderProvider](/dotnet/api/microsoft.aspnetcore.mvc.modelbinding.imodelbinderprovider) maps `byte[]` arguments to `ByteArrayModelBinder`: +ASP.NET Core MVC can take a base64-encoded string and use a `ByteArrayModelBinder` to convert it into a byte array. The maps `byte[]` arguments to `ByteArrayModelBinder`: ```csharp public IModelBinder GetBinder(ModelBinderProviderContext context) @@ -55,7 +47,7 @@ public IModelBinder GetBinder(ModelBinderProviderContext context) } ``` -When creating your own custom model binder, you can implement your own `IModelBinderProvider` type, or use the [ModelBinderAttribute](/dotnet/api/microsoft.aspnetcore.mvc.modelbinderattribute). +When creating your own custom model binder, you can implement your own `IModelBinderProvider` type, or use the . The following example shows how to use `ByteArrayModelBinder` to convert a base64-encoded string to a `byte[]` and save the result to a file: @@ -115,15 +107,7 @@ To use a custom model binder provider, add it in `ConfigureServices`: [!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Startup.cs?name=snippet_ConfigureServices&highlight=5-10)] -When evaluating model binders, the collection of providers is examined in order. The first provider that returns a binder is used. - -The following image shows the default model binders from the debugger. - -![default model binders](custom-model-binding/images/default-model-binders.png "default model binders") - -Adding your provider to the end of the collection may result in a built-in model binder being called before your custom binder has a chance. In this example, the custom provider is added to the beginning of the collection to ensure it's used for `Author` action arguments. - -[!code-csharp[](custom-model-binding/samples/2.x/CustomModelBindingSample/Startup.cs?name=snippet_ConfigureServices&highlight=5-10)] +When evaluating model binders, the collection of providers is examined in order. The first provider that returns a binder is used. Adding your provider to the end of the collection may result in a built-in model binder being called before your custom binder has a chance. In this example, the custom provider is added to the beginning of the collection to ensure it's used for `Author` action arguments. ### Polymorphic model binding @@ -142,4 +126,4 @@ Custom model binders: - Shouldn't attempt to set status codes or return results (for example, 404 Not Found). If model binding fails, an [action filter](xref:mvc/controllers/filters) or logic within the action method itself should handle the failure. - Are most useful for eliminating repetitive code and cross-cutting concerns from action methods. -- Typically shouldn't be used to convert a string into a custom type, a [TypeConverter](/dotnet/api/system.componentmodel.typeconverter) is usually a better option. +- Typically shouldn't be used to convert a string into a custom type, a is usually a better option. diff --git a/aspnetcore/mvc/advanced/custom-model-binding/images/bot.png b/aspnetcore/mvc/advanced/custom-model-binding/images/bot.png deleted file mode 100644 index 0d65dd0e3565c05dcd80fca1ac67e2b7741d94fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14962 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 F{s$lyh9dv~ diff --git a/aspnetcore/mvc/advanced/custom-model-binding/images/default-model-binders.png b/aspnetcore/mvc/advanced/custom-model-binding/images/default-model-binders.png deleted file mode 100644 index f6ebd4efdb1687ad65997b54007a0ad6a083ae4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7038 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