From f1c62ef30234c1ffe767abbd11e3c830402aea76 Mon Sep 17 00:00:00 2001 From: Kirthi Krishnamraju Date: Tue, 27 Jan 2015 10:41:52 -0800 Subject: [PATCH] Fix for #1837 - Determine model type at runtime for TryUpdateModel and added a test --- .../ParameterBinding/ModelBindingHelper.cs | 3 ++- .../ModelBindingTests.cs | 21 +++++++++++++++++++ .../Controllers/TryUpdateModelController.cs | 10 +++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Mvc.Core/ParameterBinding/ModelBindingHelper.cs b/src/Microsoft.AspNet.Mvc.Core/ParameterBinding/ModelBindingHelper.cs index a09b3f8a36..86775f3a85 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ParameterBinding/ModelBindingHelper.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ParameterBinding/ModelBindingHelper.cs @@ -138,7 +138,8 @@ namespace Microsoft.AspNet.Mvc { var modelMetadata = metadataProvider.GetMetadataForType( modelAccessor: null, - modelType: typeof(TModel)); + modelType: model.GetType()); + var operationBindingContext = new OperationBindingContext { ModelBinder = modelBinder, diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/ModelBindingTests.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/ModelBindingTests.cs index a71b41e1b6..07a648c259 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/ModelBindingTests.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/ModelBindingTests.cs @@ -1429,5 +1429,26 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests Assert.Equal("test.txt", fileDetails.Filename); Assert.Equal("Test Content", fileDetails.Content); } + + [Fact] + public async Task TryUpdateModel_ReturnDerivedAndBaseProperties() + { + // Arrange + var server = TestServer.Create(_services, _app); + var client = server.CreateClient(); + + // Act + var response = await client.GetStringAsync("http://localhost/TryUpdateModel/" + + "GetEmployeeAsync_BindToBaseDeclaredType" + + "?Parent.Name=fatherName&Parent.Parent.Name=grandFatherName&Department=Sales"); + + // Assert + var employee = JsonConvert.DeserializeObject(response); + Assert.Equal("fatherName", employee.Parent.Name); + Assert.Equal("Sales", employee.Department); + + // Round-tripped value includes descendent instances for all properties with data in the request. + Assert.Equal("grandFatherName", employee.Parent.Parent.Name); + } } } \ No newline at end of file diff --git a/test/WebSites/ModelBindingWebSite/Controllers/TryUpdateModelController.cs b/test/WebSites/ModelBindingWebSite/Controllers/TryUpdateModelController.cs index 285bce79b4..77fb8539f7 100644 --- a/test/WebSites/ModelBindingWebSite/Controllers/TryUpdateModelController.cs +++ b/test/WebSites/ModelBindingWebSite/Controllers/TryUpdateModelController.cs @@ -98,6 +98,16 @@ namespace ModelBindingWebSite.Controllers return user; } + public async Task GetEmployeeAsync_BindToBaseDeclaredType() + { + var employee = new Employee(); + await TryUpdateModelAsync( + employee, + prefix: string.Empty); + + return employee; + } + private User GetUser(int id) { return new User