[Fixes #2609] Support comma separated string include in BindAttribute
This commit is contained in:
parent
12ed69e72a
commit
eba352166d
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue