[Fixes #2609] Support comma separated string include in BindAttribute

This commit is contained in:
Ajay Bhargav Baaskaran 2015-06-05 16:18:29 -07:00
parent 12ed69e72a
commit eba352166d
2 changed files with 30 additions and 6 deletions

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Microsoft.AspNet.Mvc.Core;
@ -30,13 +31,19 @@ namespace Microsoft.AspNet.Mvc
/// <param name="include">Names of parameters to include in binding.</param>
public BindAttribute(params string[] include)
{
Include = include;
var items = new List<string>();
foreach (var item in include)
{
items.AddRange(SplitString(item));
}
Include = items.ToArray();
}
/// <summary>
/// Creates a new instance of <see cref="BindAttribute"/>.
/// </summary>
/// <param name="predicateProviderType">The type which implements
/// <param name="predicateProviderType">The type which implements
/// <see cref="IPropertyBindingPredicateProvider"/>.
/// </param>
public BindAttribute([NotNull] Type predicateProviderType)
@ -92,7 +99,7 @@ namespace Microsoft.AspNet.Mvc
{
if (_predicateFromInclude == null)
{
_predicateFromInclude =
_predicateFromInclude =
(context, propertyName) => Include.Contains(propertyName, StringComparer.Ordinal);
}
@ -136,5 +143,17 @@ namespace Microsoft.AspNet.Mvc
return predicate(context, propertyName);
};
}
private static IEnumerable<string> SplitString(string original)
{
if (string.IsNullOrEmpty(original))
{
return new string[0];
}
var split = original.Split(',').Select(piece => piece.Trim()).Where(piece => !string.IsNullOrEmpty(piece));
return split;
}
}
}

View File

@ -44,10 +44,15 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
[InlineData("UserName", true)]
[InlineData("Username", false)]
[InlineData("Password", false)]
[InlineData("LastName", true)]
[InlineData("MiddleName", true)]
[InlineData(" ", false)]
[InlineData("foo", true)]
[InlineData("bar", true)]
public void BindAttribute_Include(string property, bool isIncluded)
{
// Arrange
var bind = new BindAttribute(new string[] { "UserName", "FirstName" });
var bind = new BindAttribute(new string[] { "UserName", "FirstName", "LastName, MiddleName, ,foo,bar " });
var context = new ModelBindingContext();
@ -74,7 +79,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
HttpContext = new DefaultHttpContext(),
};
var services = new Mock<IServiceProvider>();
context.OperationBindingContext.HttpContext.RequestServices = services.Object;
// Act
@ -99,7 +104,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
};
var services = new Mock<IServiceProvider>(MockBehavior.Strict);
context.OperationBindingContext.HttpContext.RequestServices = services.Object;
// Act