Adding support for RazorView.IsSectionDefined
This commit is contained in:
parent
c0d06f1fbc
commit
94c028a5df
|
|
@ -170,6 +170,22 @@ namespace Microsoft.AspNet.Mvc.Razor
|
|||
return string.Format(CultureInfo.CurrentCulture, GetString("ViewEngine_ViewNotFound"), p0, p1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The method '{0}' cannot be invoked by this view.
|
||||
/// </summary>
|
||||
internal static string View_MethodCannotBeCalled
|
||||
{
|
||||
get { return GetString("View_MethodCannotBeCalled"); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The method '{0}' cannot be invoked by this view.
|
||||
/// </summary>
|
||||
internal static string FormatView_MethodCannotBeCalled(object p0)
|
||||
{
|
||||
return string.Format(CultureInfo.CurrentCulture, GetString("View_MethodCannotBeCalled"), p0);
|
||||
}
|
||||
|
||||
private static string GetString(string name, params string[] formatterNames)
|
||||
{
|
||||
var value = _resourceManager.GetString(name);
|
||||
|
|
|
|||
|
|
@ -259,6 +259,12 @@ namespace Microsoft.AspNet.Mvc.Razor
|
|||
SectionWriters[name] = action;
|
||||
}
|
||||
|
||||
public bool IsSectionDefined([NotNull] string name)
|
||||
{
|
||||
EnsureMethodCanBeInvoked("IsSectionDefined");
|
||||
return PreviousSectionWriters.ContainsKey(name);
|
||||
}
|
||||
|
||||
public HelperResult RenderSection([NotNull] string name)
|
||||
{
|
||||
return RenderSection(name, required: true);
|
||||
|
|
@ -266,9 +272,10 @@ namespace Microsoft.AspNet.Mvc.Razor
|
|||
|
||||
public HelperResult RenderSection([NotNull] string name, bool required)
|
||||
{
|
||||
EnsureMethodCanBeInvoked("RenderSection");
|
||||
|
||||
HelperResult action;
|
||||
if (PreviousSectionWriters != null &&
|
||||
PreviousSectionWriters.TryGetValue(name, out action))
|
||||
if (PreviousSectionWriters.TryGetValue(name, out action))
|
||||
{
|
||||
return action;
|
||||
}
|
||||
|
|
@ -283,5 +290,13 @@ namespace Microsoft.AspNet.Mvc.Razor
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureMethodCanBeInvoked(string methodName)
|
||||
{
|
||||
if (PreviousSectionWriters == null)
|
||||
{
|
||||
throw new InvalidOperationException(Resources.FormatView_MethodCannotBeCalled(methodName));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -147,4 +147,7 @@
|
|||
<data name="ViewEngine_ViewNotFound" xml:space="preserve">
|
||||
<value>The view '{0}' was not found. The following locations were searched:{1}.</value>
|
||||
</data>
|
||||
<data name="View_MethodCannotBeCalled" xml:space="preserve">
|
||||
<value>The method '{0}' cannot be invoked by this view.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNet.Mvc.Rendering;
|
||||
using Microsoft.AspNet.Testing;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
|
|
@ -56,6 +57,25 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
|||
Assert.Same(actual, expected);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task RenderSection_ThrowsIfNoPreviousPage()
|
||||
{
|
||||
// Arrange
|
||||
Exception ex = null;
|
||||
var view = CreateView(v =>
|
||||
{
|
||||
ex = Assert.Throws<InvalidOperationException>(() => v.RenderSection("bar"));
|
||||
});
|
||||
var viewContext = CreateViewContext(layoutView: null);
|
||||
|
||||
// Act
|
||||
await view.RenderAsync(viewContext);
|
||||
|
||||
// Assert
|
||||
Assert.Equal("The method 'RenderSection' cannot be invoked by this view.",
|
||||
ex.Message);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task RenderSection_ThrowsIfRequiredSectionIsNotFound()
|
||||
{
|
||||
|
|
@ -80,7 +100,63 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
|||
// Assert
|
||||
Assert.Equal("Section 'bar' is not defined.", ex.Message);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void IsSectionDefined_ThrowsIfNoPreviousExecutingPage()
|
||||
{
|
||||
// Arrange
|
||||
var view = CreateView(v => { });
|
||||
var viewContext = CreateViewContext(layoutView: null);
|
||||
|
||||
// Act and Assert
|
||||
ExceptionAssert.Throws<InvalidOperationException>(() => view.IsSectionDefined("foo"),
|
||||
"The method 'IsSectionDefined' cannot be invoked by this view.");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task IsSectionDefined_ReturnsFalseIfSectionNotDefined()
|
||||
{
|
||||
// Arrange
|
||||
bool? actual = null;
|
||||
var view = CreateView(v =>
|
||||
{
|
||||
v.DefineSection("baz", new HelperResult(writer => { }));
|
||||
v.Layout = LayoutPath;
|
||||
});
|
||||
var layoutView = CreateView(v =>
|
||||
{
|
||||
actual = v.IsSectionDefined("foo");
|
||||
});
|
||||
|
||||
// Act
|
||||
await view.RenderAsync(CreateViewContext(layoutView));
|
||||
|
||||
// Assert
|
||||
Assert.Equal(false, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task IsSectionDefined_ReturnsTrueIfSectionDefined()
|
||||
{
|
||||
// Arrange
|
||||
bool? actual = null;
|
||||
var view = CreateView(v =>
|
||||
{
|
||||
v.DefineSection("foo", new HelperResult(writer => { }));
|
||||
v.Layout = LayoutPath;
|
||||
});
|
||||
var layoutView = CreateView(v =>
|
||||
{
|
||||
actual = v.IsSectionDefined("foo");
|
||||
});
|
||||
|
||||
// Act
|
||||
await view.RenderAsync(CreateViewContext(layoutView));
|
||||
|
||||
// Assert
|
||||
Assert.Equal(true, actual);
|
||||
}
|
||||
|
||||
public static RazorView CreateView(Action<RazorView> executeAction)
|
||||
{
|
||||
var view = new Mock<RazorView> { CallBase = true };
|
||||
|
|
|
|||
Loading…
Reference in New Issue