[Fixes #5170] Fixed KeyNotFoundException in UrlHelperFactory.GetUrlHelper()
This commit is contained in:
parent
3aa6d739ce
commit
9ed753288f
|
|
@ -32,13 +32,15 @@ namespace Microsoft.AspNetCore.Mvc.Routing
|
|||
}
|
||||
|
||||
// Perf: Create only one UrlHelper per context
|
||||
var urlHelper = httpContext.Items[typeof(IUrlHelper)] as IUrlHelper;
|
||||
if (urlHelper == null)
|
||||
object value;
|
||||
if (httpContext.Items.TryGetValue(typeof(IUrlHelper), out value) && value is IUrlHelper)
|
||||
{
|
||||
urlHelper = new UrlHelper(context);
|
||||
httpContext.Items[typeof(IUrlHelper)] = urlHelper;
|
||||
return (IUrlHelper)value;
|
||||
}
|
||||
|
||||
var urlHelper = new UrlHelper(context);
|
||||
httpContext.Items[typeof(IUrlHelper)] = urlHelper;
|
||||
|
||||
return urlHelper;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -971,6 +971,68 @@ namespace Microsoft.AspNetCore.Mvc.Routing
|
|||
Assert.Equal(expected, url);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetUrlHelper_ReturnsSameInstance_IfAlreadyPresent()
|
||||
{
|
||||
// Arrange
|
||||
var expectedUrlHelper = CreateUrlHelper();
|
||||
var httpContext = new Mock<HttpContext>();
|
||||
var mockItems = new Dictionary<object, object>
|
||||
{
|
||||
{ typeof(IUrlHelper), expectedUrlHelper }
|
||||
};
|
||||
httpContext.Setup(h => h.Items).Returns(mockItems);
|
||||
|
||||
var actionContext = CreateActionContext(httpContext.Object, Mock.Of<IRouter>());
|
||||
var urlHelperFactory = new UrlHelperFactory();
|
||||
|
||||
// Act
|
||||
var urlHelper = urlHelperFactory.GetUrlHelper(actionContext);
|
||||
|
||||
// Assert
|
||||
Assert.Same(expectedUrlHelper, urlHelper);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetUrlHelper_CreatesNewInstance_IfNotAlreadyPresent()
|
||||
{
|
||||
// Arrange
|
||||
var httpContext = new Mock<HttpContext>();
|
||||
httpContext.Setup(h => h.Items).Returns(new Dictionary<object, object>());
|
||||
|
||||
var actionContext = CreateActionContext(httpContext.Object, Mock.Of<IRouter>());
|
||||
var urlHelperFactory = new UrlHelperFactory();
|
||||
|
||||
// Act
|
||||
var urlHelper = urlHelperFactory.GetUrlHelper(actionContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(urlHelper);
|
||||
Assert.Same(urlHelper, actionContext.HttpContext.Items[typeof(IUrlHelper)] as IUrlHelper);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetUrlHelper_CreatesNewInstance_IfExpectedTypeIsNotPresent()
|
||||
{
|
||||
// Arrange
|
||||
var httpContext = new Mock<HttpContext>();
|
||||
var mockItems = new Dictionary<object, object>
|
||||
{
|
||||
{ typeof(IUrlHelper), null }
|
||||
};
|
||||
httpContext.Setup(h => h.Items).Returns(mockItems);
|
||||
|
||||
var actionContext = CreateActionContext(httpContext.Object, Mock.Of<IRouter>());
|
||||
var urlHelperFactory = new UrlHelperFactory();
|
||||
|
||||
// Act
|
||||
var urlHelper = urlHelperFactory.GetUrlHelper(actionContext);
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(urlHelper);
|
||||
Assert.Same(urlHelper, actionContext.HttpContext.Items[typeof(IUrlHelper)] as IUrlHelper);
|
||||
}
|
||||
|
||||
private static HttpContext CreateHttpContext(
|
||||
IServiceProvider services,
|
||||
string appRoot)
|
||||
|
|
|
|||
Loading…
Reference in New Issue