MVC companion to aspnet/Routing#238
This is a companion change to make the RouteValueDictionary type more promient. Using the concrete type here allows to avoid allocations in a lot of common scenarios.
This commit is contained in:
parent
6e299d695f
commit
4bcf236450
|
|
@ -2,11 +2,10 @@
|
|||
// 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 Microsoft.AspNet.Http;
|
||||
using Microsoft.AspNet.Mvc.Core;
|
||||
using Microsoft.AspNet.Routing;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Internal;
|
||||
using Microsoft.Net.Http.Headers;
|
||||
|
||||
namespace Microsoft.AspNet.Mvc
|
||||
|
|
@ -33,7 +32,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
{
|
||||
ActionName = actionName;
|
||||
ControllerName = controllerName;
|
||||
RouteValues = PropertyHelper.ObjectToDictionary(routeValues);
|
||||
RouteValues = routeValues == null ? null : new RouteValueDictionary(routeValues);
|
||||
StatusCode = StatusCodes.Status201Created;
|
||||
}
|
||||
|
||||
|
|
@ -55,7 +54,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
/// <summary>
|
||||
/// Gets or sets the route data to use for generating the URL.
|
||||
/// </summary>
|
||||
public IDictionary<string, object> RouteValues { get; set; }
|
||||
public RouteValueDictionary RouteValues { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void OnFormatting(ActionContext context)
|
||||
|
|
|
|||
|
|
@ -2,11 +2,10 @@
|
|||
// 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 Microsoft.AspNet.Http;
|
||||
using Microsoft.AspNet.Mvc.Core;
|
||||
using Microsoft.AspNet.Routing;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Internal;
|
||||
using Microsoft.Net.Http.Headers;
|
||||
|
||||
namespace Microsoft.AspNet.Mvc
|
||||
|
|
@ -41,7 +40,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
: base(value)
|
||||
{
|
||||
RouteName = routeName;
|
||||
RouteValues = PropertyHelper.ObjectToDictionary(routeValues);
|
||||
RouteValues = routeValues == null ? null : new RouteValueDictionary(routeValues);
|
||||
StatusCode = StatusCodes.Status201Created;
|
||||
}
|
||||
|
||||
|
|
@ -58,7 +57,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
/// <summary>
|
||||
/// Gets or sets the route data to use for generating the URL.
|
||||
/// </summary>
|
||||
public IDictionary<string, object> RouteValues { get; set; }
|
||||
public RouteValueDictionary RouteValues { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void OnFormatting(ActionContext context)
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@
|
|||
// 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 Microsoft.AspNet.Mvc.Core;
|
||||
using Microsoft.AspNet.Mvc.Logging;
|
||||
using Microsoft.AspNet.Mvc.ViewFeatures;
|
||||
using Microsoft.AspNet.Routing;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
|
|
@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
public RedirectToActionResult(
|
||||
string actionName,
|
||||
string controllerName,
|
||||
IDictionary<string, object> routeValues)
|
||||
object routeValues)
|
||||
: this(actionName, controllerName, routeValues, permanent: false)
|
||||
{
|
||||
}
|
||||
|
|
@ -24,25 +24,38 @@ namespace Microsoft.AspNet.Mvc
|
|||
public RedirectToActionResult(
|
||||
string actionName,
|
||||
string controllerName,
|
||||
IDictionary<string, object> routeValues,
|
||||
object routeValues,
|
||||
bool permanent)
|
||||
{
|
||||
ActionName = actionName;
|
||||
ControllerName = controllerName;
|
||||
RouteValues = routeValues;
|
||||
RouteValues = routeValues == null ? null : new RouteValueDictionary(routeValues);
|
||||
Permanent = permanent;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the <see cref="IUrlHelper" /> used to generate URLs.
|
||||
/// </summary>
|
||||
public IUrlHelper UrlHelper { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the name of the action to use for generating the URL.
|
||||
/// </summary>
|
||||
public string ActionName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the name of the controller to use for generating the URL.
|
||||
/// </summary>
|
||||
public string ControllerName { get; set; }
|
||||
|
||||
public IDictionary<string, object> RouteValues { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the route data to use for generating the URL.
|
||||
/// </summary>
|
||||
public RouteValueDictionary RouteValues { get; set; }
|
||||
|
||||
public bool Permanent { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void ExecuteResult(ActionContext context)
|
||||
{
|
||||
if (context == null)
|
||||
|
|
|
|||
|
|
@ -2,12 +2,11 @@
|
|||
// 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 Microsoft.AspNet.Mvc.Core;
|
||||
using Microsoft.AspNet.Mvc.Logging;
|
||||
using Microsoft.AspNet.Mvc.ViewFeatures;
|
||||
using Microsoft.AspNet.Routing;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Internal;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Microsoft.AspNet.Mvc
|
||||
|
|
@ -32,18 +31,28 @@ namespace Microsoft.AspNet.Mvc
|
|||
bool permanent)
|
||||
{
|
||||
RouteName = routeName;
|
||||
RouteValues = PropertyHelper.ObjectToDictionary(routeValues);
|
||||
RouteValues = routeValues == null ? null : new RouteValueDictionary(routeValues);
|
||||
Permanent = permanent;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the <see cref="IUrlHelper" /> used to generate URLs.
|
||||
/// </summary>
|
||||
public IUrlHelper UrlHelper { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the name of the route to use for generating the URL.
|
||||
/// </summary>
|
||||
public string RouteName { get; set; }
|
||||
|
||||
public IDictionary<string, object> RouteValues { get; set; }
|
||||
/// <summary>
|
||||
/// Gets or sets the route data to use for generating the URL.
|
||||
/// </summary>
|
||||
public RouteValueDictionary RouteValues { get; set; }
|
||||
|
||||
public bool Permanent { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void ExecuteResult(ActionContext context)
|
||||
{
|
||||
if (context == null)
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Mvc.Routing
|
|||
_actionContextAccessor = actionContextAccessor;
|
||||
}
|
||||
|
||||
protected IDictionary<string, object> AmbientValues => ActionContext.RouteData.Values;
|
||||
protected RouteValueDictionary AmbientValues => ActionContext.RouteData.Values;
|
||||
|
||||
protected ActionContext ActionContext => _actionContextAccessor.ActionContext;
|
||||
|
||||
|
|
@ -46,7 +46,7 @@ namespace Microsoft.AspNet.Mvc.Routing
|
|||
throw new ArgumentNullException(nameof(actionContext));
|
||||
}
|
||||
|
||||
var valuesDictionary = PropertyHelper.ObjectToDictionary(actionContext.Values);
|
||||
var valuesDictionary = new RouteValueDictionary(actionContext.Values);
|
||||
|
||||
if (actionContext.Action == null)
|
||||
{
|
||||
|
|
@ -106,7 +106,7 @@ namespace Microsoft.AspNet.Mvc.Routing
|
|||
throw new ArgumentNullException(nameof(routeContext));
|
||||
}
|
||||
|
||||
var valuesDictionary = PropertyHelper.ObjectToDictionary(routeContext.Values);
|
||||
var valuesDictionary = new RouteValueDictionary(routeContext.Values);
|
||||
|
||||
var path = GeneratePathFromRoute(routeContext.RouteName, valuesDictionary);
|
||||
if (path == null)
|
||||
|
|
@ -117,7 +117,7 @@ namespace Microsoft.AspNet.Mvc.Routing
|
|||
return GenerateUrl(routeContext.Protocol, routeContext.Host, path, routeContext.Fragment);
|
||||
}
|
||||
|
||||
private string GeneratePathFromRoute(IDictionary<string, object> values)
|
||||
private string GeneratePathFromRoute(RouteValueDictionary values)
|
||||
{
|
||||
return GeneratePathFromRoute(routeName: null, values: values);
|
||||
}
|
||||
|
|
@ -129,7 +129,7 @@ namespace Microsoft.AspNet.Mvc.Routing
|
|||
/// <param name="routeName">The name of the route that is used to generate the URL.</param>
|
||||
/// <param name="values">A dictionary that contains the parameters for a route.</param>
|
||||
/// <returns>The absolute path of the URL.</returns>
|
||||
protected virtual string GeneratePathFromRoute(string routeName, IDictionary<string, object> values)
|
||||
protected virtual string GeneratePathFromRoute(string routeName, RouteValueDictionary values)
|
||||
{
|
||||
var context = new VirtualPathContext(HttpContext, AmbientValues, values, routeName);
|
||||
var pathData = Router.GetVirtualPath(context);
|
||||
|
|
|
|||
|
|
@ -706,7 +706,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
string controllerName,
|
||||
object routeValues)
|
||||
{
|
||||
return new RedirectToActionResult(actionName, controllerName, PropertyHelper.ObjectToDictionary(routeValues))
|
||||
return new RedirectToActionResult(actionName, controllerName, routeValues)
|
||||
{
|
||||
UrlHelper = Url,
|
||||
};
|
||||
|
|
@ -768,7 +768,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
return new RedirectToActionResult(
|
||||
actionName,
|
||||
controllerName,
|
||||
PropertyHelper.ObjectToDictionary(routeValues),
|
||||
routeValues,
|
||||
permanent: true)
|
||||
{
|
||||
UrlHelper = Url,
|
||||
|
|
@ -1101,7 +1101,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
/// </summary>
|
||||
/// <param name="actionName">The name of the action to use for generating the URL.</param>
|
||||
/// <param name="value">The content value to format in the entity body.</param>
|
||||
/// <returns>The created <see cref="CreatedAtRouteResult"/> for the response.</returns>
|
||||
/// <returns>The created <see cref="CreatedAtActionResult"/> for the response.</returns>
|
||||
[NonAction]
|
||||
public virtual CreatedAtActionResult CreatedAtAction(string actionName, object value)
|
||||
{
|
||||
|
|
@ -1114,7 +1114,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
/// <param name="actionName">The name of the action to use for generating the URL.</param>
|
||||
/// <param name="routeValues">The route data to use for generating the URL.</param>
|
||||
/// <param name="value">The content value to format in the entity body.</param>
|
||||
/// <returns>The created <see cref="CreatedAtRouteResult"/> for the response.</returns>
|
||||
/// <returns>The created <see cref="CreatedAtActionResult"/> for the response.</returns>
|
||||
[NonAction]
|
||||
public virtual CreatedAtActionResult CreatedAtAction(string actionName, object routeValues, object value)
|
||||
{
|
||||
|
|
@ -1128,7 +1128,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
/// <param name="controllerName">The name of the controller to use for generating the URL.</param>
|
||||
/// <param name="routeValues">The route data to use for generating the URL.</param>
|
||||
/// <param name="value">The content value to format in the entity body.</param>
|
||||
/// <returns>The created <see cref="CreatedAtRouteResult"/> for the response.</returns>
|
||||
/// <returns>The created <see cref="CreatedAtActionResult"/> for the response.</returns>
|
||||
[NonAction]
|
||||
public virtual CreatedAtActionResult CreatedAtAction(
|
||||
string actionName,
|
||||
|
|
|
|||
|
|
@ -1192,13 +1192,13 @@ namespace Microsoft.AspNet.Mvc.Test
|
|||
yield return new object[]
|
||||
{
|
||||
null,
|
||||
Enumerable.Empty<KeyValuePair<string, object>>()
|
||||
null,
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
new Dictionary<string, object> { { "hello", "world" } },
|
||||
new[] { new KeyValuePair<string, object>("hello", "world") }
|
||||
new RouteValueDictionary() { { "hello", "world" } },
|
||||
};
|
||||
|
||||
var expected2 = new Dictionary<string, object>
|
||||
|
|
@ -1210,7 +1210,7 @@ namespace Microsoft.AspNet.Mvc.Test
|
|||
yield return new object[]
|
||||
{
|
||||
new RouteValueDictionary(expected2),
|
||||
expected2
|
||||
new RouteValueDictionary(expected2),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -345,7 +345,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
|
||||
createdAtRouteResult = Assert.IsType<CreatedAtRouteResult>(result);
|
||||
Assert.Null(createdAtRouteResult.RouteName);
|
||||
Assert.Empty(createdAtRouteResult.RouteValues);
|
||||
Assert.Null(createdAtRouteResult.RouteValues);
|
||||
Assert.Null(createdAtRouteResult.Value);
|
||||
}
|
||||
|
||||
|
|
@ -385,7 +385,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
Assert.Null(createdAtActionResult.ActionName);
|
||||
Assert.Null(createdAtActionResult.ControllerName);
|
||||
Assert.Null(createdAtActionResult.Value);
|
||||
Assert.Empty(createdAtActionResult.RouteValues);
|
||||
Assert.Null(createdAtActionResult.RouteValues);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
@ -418,7 +418,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
|
||||
redirectToRouteResult = Assert.IsType<RedirectToRouteResult>(result);
|
||||
Assert.Null(redirectToRouteResult.RouteName);
|
||||
Assert.Empty(redirectToRouteResult.RouteValues);
|
||||
Assert.Null(redirectToRouteResult.RouteValues);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
@ -454,7 +454,7 @@ namespace Microsoft.AspNet.Mvc
|
|||
redirectToActionResult = Assert.IsType<RedirectToActionResult>(result);
|
||||
Assert.Null(redirectToActionResult.ControllerName);
|
||||
Assert.Null(redirectToActionResult.ActionName);
|
||||
Assert.Empty(redirectToActionResult.RouteValues);
|
||||
Assert.Null(redirectToActionResult.RouteValues);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
|
|
|||
Loading…
Reference in New Issue