Commit Graph

37 Commits

Author SHA1 Message Date
Kiran Challa ac98417398 ModelBinding: Remove IsReadOnly checks and add/update tests 2016-08-04 14:20:23 -07:00
Doug Bunting 52e4ca7232 Put `ModelBindingHelper` on a diet
- remove extra argument checks
- remove two test-only `ConvertTo()` overloads
 - this relates to #4521
2016-07-15 11:53:32 -07:00
Ryan Brandenburg 310ab25347 Make tests resilient to Localization (#5011) 2016-07-14 09:28:01 -07:00
Doug Bunting 42cea41737 Fail more gracefully when option collections cleared
- #4690
- move `ModelBindingMessageProvider` init from `DefaultBindingMetadataProvider` to `DefaultModelMetadata`
 - in addition to avoiding error cases, this removes some boilerplate
- add specific errors to `BodyModelBinderProvider`, `CompilerCache`, `CompositeViewEngine`, `ModelBinderFactory`,
  and `ObjectResultExecutor`
 - `DefaultRazorViewEngineFileProviderAccessor.FileProvider` now a `NullFileProvider` in empty case
2016-06-30 14:52:50 -07:00
Ryan Nowak 78c130d226 Fix for #4666 - reduce modelbinders created
This change to ModelBinderFactory makes the caching much more aggressive,
by caching all non-root binders. There's some trickiness here around
making sure we have the right behavior when all providers return null. See
the tests and comments.

I also kept the change I made for a temporary workaround to use a
dictionary rather than a "stack" for cycle breaking.  This seems like an
overall improvement in clarity.
2016-06-06 09:01:51 -07:00
Doug Bunting e63f094a5f Use type metadata for `ModelBinderProviderContext.BindingInfo`
- #4652
- previously ignored for top-level models
- `ModelBinderProviderContext.BindingInfo` is now never `null`
- similarly, use type metadata (as well as parameter info) for `ModelBindingContext.BinderModelName`
 - previously ignored when overridden in `ControllerArgumentBinder`
2016-05-27 23:00:29 -07:00
Ryan Nowak d92b3ba2c6 Make ModelBindingContext.Result non-nullable
This change simplifies a bunch of code and fits more in line with the
current design of model binding.

Now, a model binder only has to do anything if it was successful.
'return' is enough to indicate failure.
2016-05-23 14:18:34 -07:00
Ryan Nowak 88c9ae6588 Remove Key from ModelBindingResult 2016-05-23 13:17:19 -07:00
Ryan Brandenburg 941da9264b Move ModelBindingHelper to Internal (#4664) 2016-05-18 16:52:43 -07:00
Ryan Nowak 4d63ffa879 Make ValueProvider creation lazy
We want this change to avoid MVC eagerly reading the form. This is good
for general perf and also for scenarios where you want read the body
yourself (large file uploads).

We DO have scenarios where you want to configure the value providers
per-request or also to change the limits on the value providers (form) so
it's worth keeping these around on the context.
2016-05-13 08:11:21 -07:00
mnltejaswini 0788edbd4b [Perf] Cache the metadata for known type "object"
Fixes #4377
2016-04-25 13:03:52 -07:00
Ryan Nowak 756cd2dab8 Remove OperationBindingContext
This change trims a few concepts that aren't really needed inside
ModelBinders anymore, and removes the OperationBindingContext class.
2016-04-25 09:29:03 -07:00
Sebastien Ros 4b4d67e48e Merge branch 'release' into dev 2016-04-22 11:54:56 -07:00
Sébastien Ros 2c639f83c4 Fixing BindNever attribute and Type model binding
Fixes #4505
2016-04-22 11:52:08 -07:00
mnltejaswini 4e97c72eeb [Perf]:Cache TypeConverters in SimpleTypeModelBinder
Fixes #4361
2016-04-15 18:23:49 -07:00
Ryan Nowak 144766f2e3 Simplify BindAttribute - rename PredicateProvider
This change renames IPropertyBindingPredicateProvider to
IPropertyFilterProvider. The changes here are mostly renames of
parameters/variables from predicate -> propertyFilter. I did a
find+replace and left the term 'predicate' in some of the docs because it
refers to a predicate in the abstract sense.

This change also simplifies BindAttribute and removes support for type
activation.
2016-03-31 12:34:02 -07:00
jacalvar 1bd66ffda0 [Fixes #4089] Add support for application parts
This commit introduces application parts as a concept on MVC.

An application part is an abstraction that allows you to expose some
feature or corncern in a way that is decoupled from their underlying source.
Examples of this include types in an assembly, emdeded resources, files on
disk etc.

Application parts are configured during startup by adding or removing them from
the application part manager available as part of IMvcBuilder and IMvcCoreBuilder.

The application part manager provides the ability to populate features from the
list of available application parts by using a list of application feature providers.
Application feature providers are responsible for populating a given feature given a
list of application parts.

Examples of application providers can be a ControllerFeatureProvider
that goes through the list of application parts, sees which one of those parts exposes types,
determines which of those types are controller types, and adds them to a ControllerFeature
that holds a list of all the types that will be considered controllers in the application.
2016-03-31 12:14:04 -07:00
Doug Bunting 6bf25cecec React to HttpAbstractions namespace changes
- aspnet/HttpAbstractions#549 and aspnet/HttpAbstractions#592
- clean up `using`s
2016-03-30 16:19:42 -07:00
Ryan Nowak e1abb47b98 Fix #4238 IFormFile model binder suppresses validation
This change no longer suppresses validation for IFormFile and
IFormFileCollection model values. This will allow the use of [Required] on an
IFormFile model, or a custom attribute for validating IFormFileCollection.

These types already have ValidateChildren = false, so we don't recurse
into them.
2016-03-30 14:09:28 -07:00
Ryan Nowak fb81a5e11e Introducing ModelBinderFactory
This change separates model binding into IModelBinderProvider (decides
which binder to use) and IModelBinder (does binding). The
IModelBinderFactory is a new services with coordinates the creation of
model binders.
2016-03-29 15:45:14 -07:00
Pranav K f651f18d3a Use a prefix tree as a backing store for ModelStateDictionary 2016-03-17 10:09:36 -07:00
Doug Bunting d3c24637b1 Correct `Type.IsAssignableFrom()` polarity
- #3482
 - see new tests; many failed without fixes in the product code
 - add support for binding `IFormFileCollection` properties
 - make `FormFileModelBinder` / `HeaderModelBinder` collection handling consistent w/ `GenericModelBinder`++
  - see also dupe bug #4129 which describes some of the prior inconsistencies
  - add checks around creating collections and leaving non-top-level collections `null` (not empty)
 - move smarts down to `ModelBindingHelper.GetCompatibleCollection<T>()` (was `ConvertValuesToCollectionType<T>()`)
  - add `ModelBindingHelper.CanGetCompatibleCollection()`
  - add fallback for cases like `public IEnumerable<T> Property { get; set; } = new T[0];`
- #4193
 - allow `Exception`s while activating collections to propagate
- part of #4181
 - `CollectionModelBinder` no longer creates an instance to check if it can create an instance
 - not a complete fix since it still creates unnecessary intermediate lists

nits:
- correct a few existing test names since nothing is not the same as `ModelBindingResult.Failed()`
- remove a couple of unnecessary `return` statements
- correct stale "optimized" comments
- explicit `(string)`
2016-03-03 09:55:01 -08:00
Doug Bunting 49ffeb16d2 Test fix: Change `CollectionModelBinderTest` to update `ModelMetadata.IsReadOnly`
- unrelated to #3482 except that I discovered the issue while investigating that issue
- tests previously set `BindingDetails.IsReadOnly` for a `Type` and that was ignored
 - same for `DictionaryModelBinderTest`
2016-02-26 15:58:09 -08:00
Ryan Nowak b557ca55d9 Fix behavior of StartsWithPrefix
This undoes a behavior change introduced in
7b18d1d3f1.

The intent was to have ClearValidationState do the right thing for a case
where a collection was bound to the empty prefix, and then used again with
TryUpdateModel.

This change was implemented by saying that a key like "[0].Foo" is a match
for the prefix of "Foo". This isn't really right, and it's only
interesting for the ClearValidationState case.

The problem is that we don't know what the keys look like for a
collection. We can assume that they start with [0] but that's not really a
guarantee, it's a guess.

This change fixes the behavior of StartsWithModel, and move the
responsibility for this case back into ClearValidationState.

This change also removes the call to ClearValidationState from
TryUpdateModel. If you need this behavior, then call ClearValidationState
manually. Trying to bind and then re-bind a model object isn't really what
we intend.
2016-02-17 11:16:16 -08:00
Ryan Nowak 698502df8c Rewrite MutableObjectModelBinder
A rewrite focused on simplifying extensibility points and reducing
allocations.
2016-02-10 09:48:05 -08:00
jacalvar fe639f028f [Fixes 3961] Consider InputFormatter behavior when we can't read the charset
* Broken InputFormatter into InputFormatter and TextInputFormatter
* Added an exception to ModelState inside ReadAsync on TextInputFormatter
  when we can't find a valid encoding to read the body.
2016-02-05 10:42:36 -08:00
jacalvar 1a87f6d91a [Fixes #3915] Update FormFileModelBinder to avoid re-parsing the ContentDisposition header 2016-02-04 11:17:11 -08:00
Ajay Bhargav Baaskaran 6de171f1ef [Fixes #3904] Redesigned IValueProviderFactory and renamed a few methods 2016-02-03 11:31:05 -08:00
Louis DeJardin c116a38c87 Reducing ModelBindingContext allocations
Closes #4007, Fixes #3622, Fixes #3621

Squashed commit of the following:

commit 4b3095671d945ae79baa4fc4ba22a2ce5ebe488e
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Mon Feb 1 15:05:58 2016 -0800

    PR Feedback #4007

    ModelBindingContext.ModelType. Need similar changes a couple of
    other places in this class.

commit 7c45847d1d4c3eb02c48710bb4f100d4d1305385
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Mon Feb 1 15:01:13 2016 -0800

    PR Feedback #4007

    Please clean out the now-extra added usings for System.Diagnostics.

commit 13263fb29a0a12b472eab130eafe6760f6279262
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Mon Feb 1 14:58:52 2016 -0800

    PR Feedback #4007

    Confusing to read: How can overallResult be non-null here?

commit dfb52e1bd48397580eacf87be3541b159dbe79f1
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Mon Feb 1 14:47:28 2016 -0800

    PR Feedback #4007

    End these new guys with a period.

commit f4c745a0a805b960234cd4d810378bc40b8e5c8c
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Mon Feb 1 14:44:10 2016 -0800

    Fixing unit tests

    Also fixes rebase error in CancellationTokenModelBinder

commit f3874cc27388552e863d99d8e6631a2901f8e000
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Mon Feb 1 13:01:02 2016 -0800

    PR Feedback #4007

    Remove commented-out code.

commit 44ec1a5a3bd4fdeb4d1c4de9f0b402ff0fd34ffe
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Mon Feb 1 12:22:04 2016 -0800

    PR Feedback #4007

    Why now public?

commit 9aa45eda42ec9b11b7e6b73a14e887f1be8cb130
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Mon Feb 1 12:18:19 2016 -0800

    PR Feedback #4007

    Leave out .Test

commit 58d32d809797d25cc9b5b4c0516ae9e5992fa66e
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Fri Jan 29 15:41:14 2016 -0800

    PR Feedback #4007

    By making this async, we've undone an optimization here.
    Notice BindModelAync now has a state machine.

commit f7503228b77803b786c19e06e60f618f6f5e15c5
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Fri Jan 29 15:30:54 2016 -0800

    PR Feedback #4007

    Don't need extra line

commit cf26f3e5125792d6af0ca2afda672e241fe0e164
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Fri Jan 29 15:28:23 2016 -0800

    PR Feedback #4007

    No longer need most of the using System.Diagnostics additions

commit e90c40c4e4315462efc9ade1585e2e8c085588a4
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Fri Jan 29 15:12:50 2016 -0800

    PR Feedback #4007

    Suggest Microsoft.AspNetCore.Mvc.Internal.

commit 5360599e9c09ab97b8136977ee0917fd88f51f76
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Fri Jan 29 14:57:28 2016 -0800

    PR Feedback #4007

    Remove this line.

commit ce63edba51721412684a54886109e6b2225c6c99
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Fri Jan 29 14:14:02 2016 -0800

    PR Feedback #4007

    incorrect mentions of DefaultModelBindingContext in doc comments

commit bbc738ca2304243839e8d68615ff4bbf14f3279c
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Fri Jan 29 13:59:50 2016 -0800

    PR Feedback #4007

    Could we convert most of these setups to avoid the
    "async but not await" mess?

commit 0827e6917481e3fafb2905a3fa93cf90afb9be40
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Fri Jan 29 11:02:00 2016 -0800

    PR Feedback #4007

    remove the file

commit 3dd0d10d7f16c94df5f6d34ecb5f2efda62bccd8
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 13:34:31 2016 -0800

    Revert "PR Feedback"

    This reverts commit 589d3e65d406b127a0b833d86c05ad4a8c5172c8.

    It seems the assignment of these properties is not appropriate
    in both cases.

commit c8a97ada63fa16ee7df6c165031bf15b1c23e8a2
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 12:37:18 2016 -0800

    PR Feedback

    DefaultModelBindingContext should not be in Abstractions

commit 5e3b6a1486283f45867830693d4fd23cc967f06f
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 12:35:28 2016 -0800

    PR Feedback

    Is it still needed and, if so, where does the problem lie?

commit 44635a75af05034863f0d4b80b2eb857d43766b2
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 11:06:26 2016 -0800

    PR Feedback

    * this is either supported (shouldn't assert) or not supported (should throw). I don't feel like these asserts add much value
    * this isn't something that should throw

commit 648975cad14ac5e3738ea454c490ca221f650155
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 10:54:28 2016 -0800

    PR Feedback

    remove the other static constructors for Task<ModelBindingResult>
    they don't have a purpose anymore

commit d0e15211530668ec21406121342715b0d0f606a6
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 10:51:24 2016 -0800

    PR Feedback

    the reason for the separation was to put the implementation somewhere else

commit 2caf88df7a37664db829d660cbb5266cf6871f2c
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 10:48:25 2016 -0800

    PR Feedback

    * coding standards...
    * yea
    * private readonly

commit 6c2c640611686a554a8c417a407fe169c45a690e
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 10:46:12 2016 -0800

    PR Feedback

    * disposable -> <see cref="ModelBindingContextDisposable"/>
    * Fill in the blanks.

commit df07891c798627ac9c8fce6a7598d9386e979615
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 10:44:07 2016 -0800

    PR Feedback

    Value to assign to the ... for modelName and model as well.

commit 8e9ade7378577eddc0ba8e939deafe8d12781b8a
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 28 10:43:50 2016 -0800

    PR Feedback

    Should this just be an abstract class rather than an interface?

commit a66685e2470a84b0acbf4e797eff5010a1a066ab
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 23:47:44 2016 -0800

    PR Feedback

    Suggest resetting FallbackToEmptyPrefix for current context as part
    of PushContext().

commit d85e66f59d24e0959652f1683cb94c4b513d75c0
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 23:34:42 2016 -0800

    PR Feedback

    Add a using for the Internal namespace.

commit bef09536f881d400f15a83b7788c828903679a38
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 23:27:30 2016 -0800

    PR Feedback

    needs lots of /// doc love and blank lines

commit 4173488112f2889d662d5a7c55f249aefa821c22
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 23:06:49 2016 -0800

    PR Feedback

    Temp file accidentally added. Oops.

commit 6790d6104d5bd72ce7eab270bfe9a360cacf74f2
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 23:04:40 2016 -0800

    PR Feedback

    please remove the else bits after returns

commit 8d077ee27109133d18c5cddfe3b9b6c6e9a40e0e
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 22:57:38 2016 -0800

    PR Feedback

    The code at one point matched the comment -- always returning
    something other than NoResult. Likely the comment needs
    to change.

commit 0ea6c2186212444f46c7a48394b86b14190a9026
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 22:50:02 2016 -0800

    PR Feedback

    Don't recall why this was virtual but why remove that?

commit 0b27f3e62df6836e6e8751967c47c6192c3eec9a
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 22:35:57 2016 -0800

    PR Feedback

    No need for this line; just asserted that Result is already null.

commit c85648bb680bdbdb33381cd1af91133d04d56592
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 22:34:26 2016 -0800

    PR Feedback

    Comment needs some love since NoResult is no more.

commit a606cf32386de9e4566a678b34a195cc0720211a
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 22:18:55 2016 -0800

    PR Feedback

    * Long enough to start wrapping this. Same for a few other properties
      in this class.
    * Why is this check debug-only?
    * /// docs and some blank lines between members

commit 7efce5675a78350a4a7fde4b54fcb7886fe18252
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 20:29:50 2016 -0800

    PR Feedback

    Why not use the Task helper used elsewhere?

commit eb5fe6f95a463eb2f162f51649ffea57db87e286
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 20:28:31 2016 -0800

    PR Feedback

    Sort usings

commit df3bd00c4b59d2434e3a7be28e637d3c8008ae32
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 20:27:38 2016 -0800

    PR Feedback

    Dead code

commit fe7ec17fbb5209f2904f067ec1f91169ab05fb33
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 20:26:04 2016 -0800

    PR Feedback

    Putting internal back in place

commit 496f1f97ac48b2e95572dd6d463ced3366f8d36c
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 20:21:03 2016 -0800

    PR Feedback

    stylecop 13040: Move these to the top of the file.

commit cd003d0bca6516a907a0ae889d2e6130ff473b57
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Wed Jan 27 19:38:15 2016 -0800

    Renames to asp.net core

commit e1cf523119084e35b70f11f67f64f651c39e1c8b
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Jan 21 21:21:44 2016 -0800

    Removing NoResult and fixing tests

commit 5af6223a4d60b6c4139c1fc62ebf297ab0e5454f
Author: Louis DeJardin <lodejard@microsoft.com>
Date:   Thu Dec 17 11:49:08 2015 -0800

    Reducing ModelBindingContext allocations
2016-02-02 12:10:43 -08:00
Ryan Nowak faba95287e Fix for #3743 - CancellationToken validation
This is a fix for the specific case reported in #3743 and also a few
related cases where the object being validated does not come from user
input.

Because the CancellationToken is bound using the 'empty prefix',
suppressing validation causes the validation system to suppress ALL keys
in the MSD. This will wipe out validation info for other, unrelated model
data. The same can occur for [FromServices], IFormCollection, IFormFile,
and HttpRequestMessage (anythere when MSD key == null and
SuppressValidation == true).

The other change here is related to the [FromBody]. We don't want to
create an entry in the model state for a 'valid' model with the empty
prefix. This can cause the system to miss validation errors. If you end up
in a situation where there's an entry with the empty prefix for an invalid
state, you won't accidentally miss validation errors.
2016-01-29 18:12:19 -08:00
jacalvar 42f33668c0 Moved missing file from AspNetCore rename 2016-01-29 16:32:30 -08:00
jacalvar 7cbb263edb [Fixes #3874] Null passed as arguments to controller method parameters when no InputFormatter matches
* Add an UnsupportedContentType to the ModelState dictionary when no formatter can read the body.
* Add a filter to the pipeline that searches for that specific exception and transforms the response into 415.
2016-01-28 15:46:17 -08:00
Derek Gray 8b726ddc0c Allow the use of the Prompt property of DisplayAttribute for the placeholder attribute of input fields (addresses #3723) 2016-01-27 16:18:23 -08:00
Ryan Nowak 1a70f12bf8 Undesign client validation
This change removes a layer of abstraction. These validators now just do
what they do now without creating a bunch of intermediate objects.

ModelClientValidationRule has been removed, and client validations
manipulate the attributes collection of a tag directly.
2016-01-27 09:55:18 -08:00
Ajay Bhargav Baaskaran 8c4bcf14c7 Added caching for validators 2016-01-26 17:15:16 -08:00
N. Taylor Mullen 3be7fbdf9f Rename AspNet 5 file contents.
See https://github.com/aspnet/Announcements/issues/144 for more information.
2016-01-22 12:18:33 -08:00
N. Taylor Mullen 6a6c8ca544 Rename AspNet 5 folders and files.
See https://github.com/aspnet/Announcements/issues/144 for more information.
2016-01-22 12:17:07 -08:00