Files
acceptance-tests
data
debian
docs
external
Newtonsoft.Json
api-doc-tools
api-snapshot
aspnetwebstack
packages
src
test
Microsoft.TestCommon
Microsoft.Web.Helpers.Test
Microsoft.Web.Http.Data.Test
Microsoft.Web.Mvc.Test
Microsoft.Web.WebPages.OAuth.Test
SPA.Test
System.Json.Test.Integration
System.Json.Test.Unit
System.Net.Http.Formatting.Test.Integration
System.Net.Http.Formatting.Test.Unit
System.Web.Helpers.Test
System.Web.Http.Integration.Test
System.Web.Http.SelfHost.Test
System.Web.Http.Test
System.Web.Http.WebHost.Test
System.Web.Mvc.Test
Ajax
Async
ExpressionUtil
Html
Test
ChildActionExtensionsTest.cs
DefaultDisplayTemplatesTest.cs
DefaultEditorTemplatesTest.cs
DisplayNameExtensionsTest.cs
FormExtensionsTest.cs
InputExtensionsTest.cs
LabelExtensionsTest.cs
LinkExtensionsTest.cs
MvcFormTest.cs
NameExtensionsTest.cs
PartialExtensionsTest.cs
RenderPartialExtensionsTest.cs
SelectExtensionsTest.cs
TemplateHelpersTest.cs
TextAreaExtensionsTest.cs
ValidationExtensionsTest.cs
ValueExtensionsTest.cs
Properties
Razor
Test
Util
System.Web.Mvc.Test.csproj
packages.config
System.Web.Razor.Test
System.Web.WebPages.Administration.Test
System.Web.WebPages.Deployment.Test
System.Web.WebPages.Razor.Test
System.Web.WebPages.Test
WebMatrix.Data.Test
WebMatrix.WebData.Test
Settings.StyleCop
tools
.gitattributes
.gitignore
License.txt
README.md
Runtime.msbuild
Runtime.sln
Runtime.xunit
Settings.StyleCop
build.cmd
binary-reference-assemblies
bockbuild
boringssl
cecil
cecil-legacy
corefx
corert
ikdasm
ikvm
linker
nuget-buildtasks
nunit-lite
roslyn-binaries
rx
xunit-binaries
ikvm-native
libgc
llvm
m4
man
mcs
mono
msvc
po
runtime
samples
scripts
support
tools
COPYING.LIB
LICENSE
Makefile.am
Makefile.in
NEWS
README.md
acinclude.m4
aclocal.m4
autogen.sh
code_of_conduct.md
compile
config.guess
config.h.in
config.rpath
config.sub
configure.REMOVED.git-id
configure.ac.REMOVED.git-id
depcomp
install-sh
ltmain.sh.REMOVED.git-id
missing
mkinstalldirs
mono-uninstalled.pc.in
test-driver
winconfig.h
linux-packaging-mono/external/aspnetwebstack/test/System.Web.Mvc.Test/Html/Test/SelectExtensionsTest.cs

1860 lines
71 KiB
C#
Raw Normal View History

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
using System.Web.Mvc.Test;
using Microsoft.Web.UnitTestUtil;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Mvc.Html.Test
{
public class SelectExtensionsTest
{
private static readonly ViewDataDictionary<FooModel> _listBoxViewData = new ViewDataDictionary<FooModel> { { "foo", new[] { "Bravo" } } };
private static readonly ViewDataDictionary<FooModel> _dropDownListViewData = new ViewDataDictionary<FooModel> { { "foo", "Bravo" } };
private static readonly ViewDataDictionary<NonIEnumerableModel> _nonIEnumerableViewData = new ViewDataDictionary<NonIEnumerableModel> { { "foo", 1 } };
private static ViewDataDictionary GetViewDataWithSelectList()
{
ViewDataDictionary viewData = new ViewDataDictionary();
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", "C");
viewData["foo"] = selectList;
viewData["foo.bar"] = selectList;
return viewData;
}
// DropDownList
[Fact]
public void DropDownListUsesExplicitValueIfNotProvidedInViewData()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", "C");
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, (string)null /* optionLabel */);
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListUsesExplicitValueIfNotProvidedInViewData_Unobtrusive()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
helper.ViewContext.ClientValidationEnabled = true;
helper.ViewContext.UnobtrusiveJavaScriptEnabled = true;
helper.ViewContext.FormContext = new FormContext();
helper.ClientValidationRuleFactory = (name, metadata) => new[] { new ModelClientValidationRule { ValidationType = "type", ErrorMessage = "error" } };
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", "C");
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, (string)null /* optionLabel */);
// Assert
Assert.Equal(
@"<select data-val=""true"" data-val-type=""error"" id=""foo"" name=""foo""><option value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListUsesViewDataDefaultValue()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(_dropDownListViewData);
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings(), "Charlie");
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, (string)null /* optionLabel */);
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListUsesViewDataDefaultValueNoOptionLabel()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(_dropDownListViewData);
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings(), "Charlie");
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList);
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithAttributesDictionary()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, null /* optionLabel */, HtmlHelperTest.AttributesDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithEmptyNameThrows()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { helper.DropDownList(String.Empty, (SelectList)null /* selectList */, (string)null /* optionLabel */); },
"name");
}
[Fact]
public void DropDownListWithErrors()
{
// Arrange
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
ViewDataDictionary viewData = GetViewDataWithErrors();
HtmlHelper helper = MvcHelper.GetHtmlHelper(viewData);
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, null /* optionLabel */, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" class=""input-validation-error"" id=""foo"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithErrorsAndCustomClass()
{
// Arrange
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
ViewDataDictionary viewData = GetViewDataWithErrors();
HtmlHelper helper = MvcHelper.GetHtmlHelper(viewData);
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, null /* optionLabel */, new { @class = "foo-class" });
// Assert
Assert.Equal(
@"<select class=""input-validation-error foo-class"" id=""foo"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithNullNameThrows()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { helper.DropDownList(null /* name */, (SelectList)null /* selectList */, (string)null /* optionLabel */); },
"name");
}
[Fact]
public void DropDownListWithNullSelectListUsesViewData()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper();
helper.ViewData["foo"] = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.DropDownList("foo");
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithObjectDictionary()
{
// Arrange
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
ViewDataDictionary viewData = new ViewDataDictionary();
HtmlHelper helper = MvcHelper.GetHtmlHelper(viewData);
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, null /* optionLabel */, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithObjectDictionaryWithUnderscores()
{
// Arrange
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
ViewDataDictionary viewData = new ViewDataDictionary();
HtmlHelper helper = MvcHelper.GetHtmlHelper(viewData);
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, null /* optionLabel */, HtmlHelperTest.AttributesObjectUnderscoresDictionary);
// Assert
Assert.Equal(
@"<select foo-baz=""BazObjValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithObjectDictionaryAndSelectList()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, null /* optionLabel */, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithObjectDictionaryAndSelectListNoOptionLabel()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithObjectDictionaryWithUnderscoresAndSelectListNoOptionLabel()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, HtmlHelperTest.AttributesObjectUnderscoresDictionary);
// Assert
Assert.Equal(
@"<select foo-baz=""BazObjValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithObjectDictionaryAndEmptyOptionLabel()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, String.Empty /* optionLabel */, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" name=""foo""><option value=""""></option>
<option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithObjectDictionaryAndTitle()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, "[Select Something]", HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" name=""foo""><option value="""">[Select Something]</option>
<option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListUsesViewDataSelectList()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(GetViewDataWithSelectList());
// Act
MvcHtmlString html = helper.DropDownList("foo", (string)null /* optionLabel */);
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListUsesModelState()
{
// Arrange
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
ViewDataDictionary viewData = GetViewDataWithErrors();
viewData["foo"] = selectList;
HtmlHelper helper = MvcHelper.GetHtmlHelper(viewData);
// Act
MvcHtmlString html = helper.DropDownList("foo");
// Assert
Assert.Equal(
@"<select class=""input-validation-error"" id=""foo"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListUsesViewDataSelectListNoOptionLabel()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(GetViewDataWithSelectList());
// Act
MvcHtmlString html = helper.DropDownList("foo");
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithDotReplacementForId()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(GetViewDataWithSelectList());
// Act
MvcHtmlString html = helper.DropDownList("foo.bar");
// Assert
Assert.Equal(
@"<select id=""foo_bar"" name=""foo.bar""><option value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithIEnumerableSelectListItem()
{
// Arrange
ViewDataDictionary vdd = new ViewDataDictionary { { "foo", MultiSelectListTest.GetSampleIEnumerableObjects() } };
HtmlHelper helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.DropDownList("foo");
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option selected=""selected"" value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithIEnumerableSelectListItemSelectsDefaultFromViewData()
{
// Arrange
ViewDataDictionary vdd = new ViewDataDictionary { { "foo", "123456789" } };
HtmlHelper helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.DropDownList("foo", MultiSelectListTest.GetSampleIEnumerableObjects());
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option selected=""selected"" value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithListOfSelectListItemSelectsDefaultFromViewData()
{
// Arrange
ViewDataDictionary vdd = new ViewDataDictionary { { "foo", "123456789" } };
HtmlHelper helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.DropDownList("foo", MultiSelectListTest.GetSampleListObjects());
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option selected=""selected"" value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithListOfSelectListItem()
{
// Arrange
ViewDataDictionary vdd = new ViewDataDictionary { { "foo", MultiSelectListTest.GetSampleListObjects() } };
HtmlHelper helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.DropDownList("foo");
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option selected=""selected"" value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithNullViewDataValueThrows()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
// Act
Assert.Throws<InvalidOperationException>(
delegate { helper.DropDownList("foo", (string)null /* optionLabel */); },
"There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'foo'.");
}
[Fact]
public void DropDownListWithWrongViewDataTypeValueThrows()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary { { "foo", 123 } });
// Act
Assert.Throws<InvalidOperationException>(
delegate { helper.DropDownList("foo", (string)null /* optionLabel */); },
"The ViewData item that has the key 'foo' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.");
}
[Fact]
public void DropDownListWithPrefix()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.DropDownList("foo", selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""MyPrefix_foo"" name=""MyPrefix.foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithPrefixAndEmptyName()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.DropDownList("", selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""MyPrefix"" name=""MyPrefix""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListWithPrefixAndNullSelectListUsesViewData()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper();
helper.ViewData["foo"] = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.DropDownList("foo");
// Assert
Assert.Equal(
@"<select id=""MyPrefix_foo"" name=""MyPrefix.foo""><option>Alpha</option>
<option>Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
// DropDownListFor
[Fact]
public void DropDownListForWithNullExpressionThrows()
{
// Arrange
HtmlHelper<object> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<object>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", "C");
// Act & Assert
Assert.ThrowsArgumentNull(
() => helper.DropDownListFor<object, object>(null /* expression */, selectList),
"expression"
);
}
[Fact]
public void DropDownListForUsesExplicitValueIfNotProvidedInViewData()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", "C");
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, (string)null /* optionLabel */);
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForUsesExplicitValueIfNotProvidedInViewData_Unobtrusive()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
helper.ViewContext.ClientValidationEnabled = true;
helper.ViewContext.UnobtrusiveJavaScriptEnabled = true;
helper.ViewContext.FormContext = new FormContext();
helper.ClientValidationRuleFactory = (name, metadata) => new[] { new ModelClientValidationRule { ValidationType = "type", ErrorMessage = "error" } };
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", "C");
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, (string)null /* optionLabel */);
// Assert
Assert.Equal(
@"<select data-val=""true"" data-val-type=""error"" id=""foo"" name=""foo""><option value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithEnumerableModel_Unobtrusive()
{
// Arrange
HtmlHelper<IEnumerable<RequiredModel>> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<IEnumerable<RequiredModel>>());
helper.ViewContext.ClientValidationEnabled = true;
helper.ViewContext.UnobtrusiveJavaScriptEnabled = true;
helper.ViewContext.FormContext = new FormContext();
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", "C");
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.ElementAt(0).foo, selectList);
// Assert
Assert.Equal(
@"<select data-val=""true"" data-val-required=""The foo field is required."" id=""MyPrefix_foo"" name=""MyPrefix.foo""><option value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForUsesViewDataDefaultValue()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(_dropDownListViewData);
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings(), "Charlie");
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, (string)null /* optionLabel */);
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForUsesViewDataDefaultValueNoOptionLabel()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(_dropDownListViewData);
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings(), "Charlie");
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList);
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithAttributesDictionary()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, null /* optionLabel */, HtmlHelperTest.AttributesDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithErrors()
{
// Arrange
HtmlHelper<FooBarModel> helper = MvcHelper.GetHtmlHelper(GetViewDataWithErrors());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, null /* optionLabel */, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" class=""input-validation-error"" id=""foo"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithErrorsAndCustomClass()
{
// Arrange
HtmlHelper<FooBarModel> helper = MvcHelper.GetHtmlHelper(GetViewDataWithErrors());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, null /* optionLabel */, new { @class = "foo-class" });
// Assert
Assert.Equal(
@"<select class=""input-validation-error foo-class"" id=""foo"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithObjectDictionary()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, null /* optionLabel */, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithObjectDictionaryWithUnderscores()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, null /* optionLabel */, HtmlHelperTest.AttributesObjectUnderscoresDictionary);
// Assert
Assert.Equal(
@"<select foo-baz=""BazObjValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithObjectDictionaryAndSelectListNoOptionLabel()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithObjectDictionaryWithUnderscoresAndSelectListNoOptionLabel()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, HtmlHelperTest.AttributesObjectUnderscoresDictionary);
// Assert
Assert.Equal(
@"<select foo-baz=""BazObjValue"" id=""foo"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithObjectDictionaryAndEmptyOptionLabel()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, String.Empty /* optionLabel */, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" name=""foo""><option value=""""></option>
<option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithObjectDictionaryAndTitle()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, "[Select Something]", HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" name=""foo""><option value="""">[Select Something]</option>
<option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithIEnumerableSelectListItemSelectsDefaultFromViewData()
{
// Arrange
ViewDataDictionary<FooModel> vdd = new ViewDataDictionary<FooModel> { { "foo", "123456789" } };
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, MultiSelectListTest.GetSampleIEnumerableObjects());
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option selected=""selected"" value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithListOfSelectListItemSelectsDefaultFromViewData()
{
// Arrange
ViewDataDictionary<FooModel> vdd = new ViewDataDictionary<FooModel> { { "foo", "123456789" } };
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, MultiSelectListTest.GetSampleListObjects());
// Assert
Assert.Equal(
@"<select id=""foo"" name=""foo""><option selected=""selected"" value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithPrefix()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""MyPrefix_foo"" name=""MyPrefix.foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithPrefixAndEmptyName()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
SelectList selectList = new SelectList(MultiSelectListTest.GetSampleStrings());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.DropDownListFor(m => m, selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""MyPrefix"" name=""MyPrefix""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void DropDownListForWithPrefixAndIEnumerableSelectListItemSelectsDefaultFromViewData()
{
// Arrange
ViewDataDictionary<FooModel> vdd = new ViewDataDictionary<FooModel> { { "foo", "123456789" } };
vdd.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.DropDownListFor(m => m.foo, MultiSelectListTest.GetSampleIEnumerableObjects());
// Assert
Assert.Equal(
@"<select id=""MyPrefix_foo"" name=""MyPrefix.foo""><option selected=""selected"" value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
// ListBox
[Fact]
public void ListBoxUsesExplicitValueIfNotProvidedInViewData()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", new[] { "A", "C" });
// Act
MvcHtmlString html = helper.ListBox("foo", selectList);
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option selected=""selected"" value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxUsesExplicitValueIfNotProvidedInViewData_Unobtrusive()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
helper.ViewContext.ClientValidationEnabled = true;
helper.ViewContext.UnobtrusiveJavaScriptEnabled = true;
helper.ViewContext.FormContext = new FormContext();
helper.ClientValidationRuleFactory = (name, metadata) => new[] { new ModelClientValidationRule { ValidationType = "type", ErrorMessage = "error" } };
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", new[] { "A", "C" });
// Act
MvcHtmlString html = helper.ListBox("foo", selectList);
// Assert
Assert.Equal(
@"<select data-val=""true"" data-val-type=""error"" id=""foo"" multiple=""multiple"" name=""foo""><option selected=""selected"" value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxUsesViewDataDefaultValue()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(_listBoxViewData);
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.ListBox("foo", selectList);
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithErrors()
{
// Arrange
ViewDataDictionary viewData = GetViewDataWithErrors();
HtmlHelper helper = MvcHelper.GetHtmlHelper(viewData);
MultiSelectList list = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.ListBox("foo", list);
// Assert
Assert.Equal(
@"<select class=""input-validation-error"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithErrorsAndCustomClass()
{
// Arrange
ViewDataDictionary viewData = GetViewDataWithErrors();
HtmlHelper helper = MvcHelper.GetHtmlHelper(viewData);
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.ListBox("foo", selectList, new { @class = "foo-class" });
// Assert
Assert.Equal(
@"<select class=""input-validation-error foo-class"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithNameOnly()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper();
helper.ViewData["foo"] = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.ListBox("foo");
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithAttributesDictionary()
{
// Arrange
ViewDataDictionary viewData = new ViewDataDictionary();
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
//viewData["foo"] = selectList;
HtmlHelper helper = MvcHelper.GetHtmlHelper(viewData);
// Act
MvcHtmlString html = helper.ListBox("foo", selectList, HtmlHelperTest.AttributesDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazValue"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithAttributesDictionaryAndMultiSelectList()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.ListBox("foo", selectList, HtmlHelperTest.AttributesDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazValue"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithAttributesDictionaryOverridesName()
{
// DevDiv Bugs #217602:
// SelectInternal() should override the user-provided 'name' attribute
// Arrange
ViewDataDictionary viewData = new ViewDataDictionary();
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
HtmlHelper helper = MvcHelper.GetHtmlHelper(viewData);
// Act
MvcHtmlString html = helper.ListBox("foo", selectList, new { myAttr = "myValue", name = "theName" });
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" myAttr=""myValue"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithEmptyNameThrows()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { helper.ListBox(String.Empty, (MultiSelectList)null /* selectList */); },
"name");
}
[Fact]
public void ListBoxWithNullNameThrows()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { helper.ListBox(null /* name */, (MultiSelectList)null /* selectList */); },
"name");
}
[Fact]
public void ListBoxWithNullSelectListUsesViewData()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper();
helper.ViewData["foo"] = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.ListBox("foo", null);
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithObjectDictionary()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.ListBox("foo", selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithObjectDictionaryWithUnderscores()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.ListBox("foo", selectList, HtmlHelperTest.AttributesObjectUnderscoresDictionary);
// Assert
Assert.Equal(
@"<select foo-baz=""BazObjValue"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithIEnumerableSelectListItem()
{
// Arrange
ViewDataDictionary vdd = new ViewDataDictionary { { "foo", MultiSelectListTest.GetSampleIEnumerableObjects() } };
HtmlHelper helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.ListBox("foo");
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option selected=""selected"" value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxThrowsWhenExpressionDoesNotEvaluateToIEnumerable()
{
// Arrange
ViewDataDictionary vdd = new ViewDataDictionary { { "foo", 123456789 } };
HtmlHelper helper = MvcHelper.GetHtmlHelper(vdd);
// Act & Assert
Assert.Throws<InvalidOperationException>(
() => helper.ListBox("foo", MultiSelectListTest.GetSampleIEnumerableObjects()),
@"The parameter 'expression' must evaluate to an IEnumerable when multiple selection is allowed."
);
}
[Fact]
public void ListBoxThrowsWhenExpressionEvaluatesToString()
{
// Arrange
ViewDataDictionary vdd = new ViewDataDictionary { { "foo", "123456789" } };
HtmlHelper helper = MvcHelper.GetHtmlHelper(vdd);
// Act & Assert
Assert.Throws<InvalidOperationException>(
() => helper.ListBox("foo", MultiSelectListTest.GetSampleIEnumerableObjects()),
@"The parameter 'expression' must evaluate to an IEnumerable when multiple selection is allowed."
);
}
[Fact]
public void ListBoxWithListOfSelectListItemSelectsDefaultFromViewData()
{
// Arrange
ViewDataDictionary vdd = new ViewDataDictionary { { "foo", new string[] { "123456789", "111111111" } } };
HtmlHelper helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.ListBox("foo", MultiSelectListTest.GetSampleListObjects());
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option selected=""selected"" value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option selected=""selected"" value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithListOfSelectListItem()
{
// Arrange
ViewDataDictionary vdd = new ViewDataDictionary { { "foo", MultiSelectListTest.GetSampleListObjects() } };
HtmlHelper helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.ListBox("foo");
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option selected=""selected"" value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithPrefix()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.ListBox("foo", selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""MyPrefix_foo"" multiple=""multiple"" name=""MyPrefix.foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithPrefixAndEmptyName()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.ListBox("", selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""MyPrefix"" multiple=""multiple"" name=""MyPrefix""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxWithPrefixAndNullSelectListUsesViewData()
{
// Arrange
HtmlHelper helper = MvcHelper.GetHtmlHelper();
helper.ViewData["foo"] = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.ListBox("foo");
// Assert
Assert.Equal(
@"<select id=""MyPrefix_foo"" multiple=""multiple"" name=""MyPrefix.foo""><option>Alpha</option>
<option>Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
// ListBoxFor
[Fact]
public void ListBoxForWithNullExpressionThrows()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
// Act & Assert
Assert.ThrowsArgumentNull(
() => helper.ListBoxFor<FooModel, object>(null, null),
"expression");
}
[Fact]
public void ListBoxForUsesExplicitValueIfNotProvidedInViewData()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", new[] { "A", "C" });
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, selectList);
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option selected=""selected"" value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForUsesExplicitValueIfNotProvidedInViewData_Unobtrusive()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
helper.ViewContext.ClientValidationEnabled = true;
helper.ViewContext.UnobtrusiveJavaScriptEnabled = true;
helper.ViewContext.FormContext = new FormContext();
helper.ClientValidationRuleFactory = (name, metadata) => new[] { new ModelClientValidationRule { ValidationType = "type", ErrorMessage = "error" } };
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", new[] { "A", "C" });
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, selectList);
// Assert
Assert.Equal(
@"<select data-val=""true"" data-val-type=""error"" id=""foo"" multiple=""multiple"" name=""foo""><option selected=""selected"" value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithEnumerableModel_Unobtrusive()
{
// Arrange
HtmlHelper<IEnumerable<RequiredModel>> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<IEnumerable<RequiredModel>>());
helper.ViewContext.ClientValidationEnabled = true;
helper.ViewContext.UnobtrusiveJavaScriptEnabled = true;
helper.ViewContext.FormContext = new FormContext();
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleAnonymousObjects(), "Letter", "FullWord", "C");
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.ElementAt(0).foo, selectList);
// Assert
Assert.Equal(
@"<select data-val=""true"" data-val-required=""The foo field is required."" id=""MyPrefix_foo"" multiple=""multiple"" name=""MyPrefix.foo""><option value=""A"">Alpha</option>
<option value=""B"">Bravo</option>
<option selected=""selected"" value=""C"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForUsesViewDataDefaultValue()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(_listBoxViewData);
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, selectList);
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithErrors()
{
// Arrange
HtmlHelper<FooBarModel> helper = MvcHelper.GetHtmlHelper(GetViewDataWithErrors());
MultiSelectList list = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, list);
// Assert
Assert.Equal(
@"<select class=""input-validation-error"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithErrorsAndCustomClass()
{
// Arrange
HtmlHelper<FooBarModel> helper = MvcHelper.GetHtmlHelper(GetViewDataWithErrors());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, selectList, new { @class = "foo-class" });
// Assert
Assert.Equal(
@"<select class=""input-validation-error foo-class"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option selected=""selected"">Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithAttributesDictionary()
{
// Arrange
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, selectList, HtmlHelperTest.AttributesDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazValue"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithAttributesDictionaryOverridesName()
{
// DevDiv Bugs #217602:
// SelectInternal() should override the user-provided 'name' attribute
// Arrange
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, selectList, new { myAttr = "myValue", name = "theName" });
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" myAttr=""myValue"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithNullSelectListUsesViewData()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
helper.ViewContext.ViewData["foo"] = new MultiSelectList(MultiSelectListTest.GetSampleStrings(), new[] { "Charlie" });
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, null);
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option selected=""selected"">Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithObjectDictionary()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithObjectDictionaryWithUnderscores()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, selectList, HtmlHelperTest.AttributesObjectUnderscoresDictionary);
// Assert
Assert.Equal(
@"<select foo-baz=""BazObjValue"" id=""foo"" multiple=""multiple"" name=""foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithIEnumerableSelectListItem()
{
// Arrange
ViewDataDictionary<FooModel> vdd = new ViewDataDictionary<FooModel> { { "foo", MultiSelectListTest.GetSampleIEnumerableObjects() } };
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, null);
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option selected=""selected"" value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForThrowsWhenExpressionDoesNotEvaluateToIEnumerable()
{
// Arrange
ViewDataDictionary<NonIEnumerableModel> vdd = new ViewDataDictionary<NonIEnumerableModel> { { "foo", 123456789 } };
HtmlHelper<NonIEnumerableModel> helper = MvcHelper.GetHtmlHelper(vdd);
// Act & Assert
Assert.Throws<InvalidOperationException>(
() => helper.ListBoxFor(m => m.foo, MultiSelectListTest.GetSampleIEnumerableObjects()),
@"The parameter 'expression' must evaluate to an IEnumerable when multiple selection is allowed."
);
}
[Fact]
public void ListBoxForThrowsWhenExpressionEvaluatesToString()
{
// Arrange
ViewDataDictionary<FooModel> vdd = new ViewDataDictionary<FooModel> { { "foo", "123456789" } };
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(vdd);
// Act & Assert
Assert.Throws<InvalidOperationException>(
() => helper.ListBoxFor(m => m.foo, MultiSelectListTest.GetSampleIEnumerableObjects()),
@"The parameter 'expression' must evaluate to an IEnumerable when multiple selection is allowed."
);
}
[Fact]
public void ListBoxForWithListOfSelectListItemSelectsDefaultFromViewData()
{
// Arrange
ViewDataDictionary<FooModel> vdd = new ViewDataDictionary<FooModel> { { "foo", new string[] { "123456789", "111111111" } } };
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, MultiSelectListTest.GetSampleListObjects());
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option selected=""selected"" value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option selected=""selected"" value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithListOfSelectListItem()
{
// Arrange
ViewDataDictionary<FooModel> vdd = new ViewDataDictionary<FooModel> { { "foo", MultiSelectListTest.GetSampleListObjects() } };
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(vdd);
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, null);
// Assert
Assert.Equal(
@"<select id=""foo"" multiple=""multiple"" name=""foo""><option value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option selected=""selected"" value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithPrefix()
{
// Arrange
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(new ViewDataDictionary<FooModel>());
MultiSelectList selectList = new MultiSelectList(MultiSelectListTest.GetSampleStrings());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, selectList, HtmlHelperTest.AttributesObjectDictionary);
// Assert
Assert.Equal(
@"<select baz=""BazObjValue"" id=""MyPrefix_foo"" multiple=""multiple"" name=""MyPrefix.foo""><option>Alpha</option>
<option>Bravo</option>
<option>Charlie</option>
</select>",
html.ToHtmlString());
}
[Fact]
public void ListBoxForWithPrefixAndListOfSelectListItemSelectsDefaultFromViewData()
{
// Arrange
ViewDataDictionary<FooModel> vdd = new ViewDataDictionary<FooModel> { { "foo", new string[] { "123456789", "111111111" } } };
HtmlHelper<FooModel> helper = MvcHelper.GetHtmlHelper(vdd);
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
MvcHtmlString html = helper.ListBoxFor(m => m.foo, MultiSelectListTest.GetSampleListObjects());
// Assert
Assert.Equal(
@"<select id=""MyPrefix_foo"" multiple=""multiple"" name=""MyPrefix.foo""><option selected=""selected"" value=""123456789"">John</option>
<option value=""987654321"">Jane</option>
<option selected=""selected"" value=""111111111"">Joe</option>
</select>",
html.ToHtmlString());
}
// Culture tests
[Fact]
public void SelectHelpersUseCurrentCultureToConvertValues()
{
// Arrange
HtmlHelper defaultValueHelper = MvcHelper.GetHtmlHelper(new ViewDataDictionary
{
{ "foo", new[] { new DateTime(1900, 1, 1, 0, 0, 1) } },
{ "bar", new DateTime(1900, 1, 1, 0, 0, 1) }
});
HtmlHelper helper = MvcHelper.GetHtmlHelper();
SelectList selectList = new SelectList(GetSampleCultureAnonymousObjects(), "Date", "FullWord", new DateTime(1900, 1, 1, 0, 0, 0));
var tests = new[]
{
// DropDownList(name, selectList, optionLabel)
new
{
Html = @"<select id=""foo"" name=""foo""><option selected=""selected"" value=""1900/01/01 12:00:00 AM"">Alpha</option>
<option value=""1900/01/01 12:00:01 AM"">Bravo</option>
<option value=""1900/01/01 12:00:02 AM"">Charlie</option>
</select>",
Action = new Func<MvcHtmlString>(() => helper.DropDownList("foo", selectList, (string)null))
},
// DropDownList(name, selectList, optionLabel) (With default value selected from ViewData)
new
{
Html = @"<select id=""bar"" name=""bar""><option value=""1900/01/01 12:00:00 AM"">Alpha</option>
<option selected=""selected"" value=""1900/01/01 12:00:01 AM"">Bravo</option>
<option value=""1900/01/01 12:00:02 AM"">Charlie</option>
</select>",
Action = new Func<MvcHtmlString>(() => defaultValueHelper.DropDownList("bar", selectList, (string)null))
},
// ListBox(name, selectList)
new
{
Html = @"<select id=""foo"" multiple=""multiple"" name=""foo""><option selected=""selected"" value=""1900/01/01 12:00:00 AM"">Alpha</option>
<option value=""1900/01/01 12:00:01 AM"">Bravo</option>
<option value=""1900/01/01 12:00:02 AM"">Charlie</option>
</select>",
Action = new Func<MvcHtmlString>(() => helper.ListBox("foo", selectList))
},
// ListBox(name, selectList) (With default value selected from ViewData)
new
{
Html = @"<select id=""foo"" multiple=""multiple"" name=""foo""><option value=""1900/01/01 12:00:00 AM"">Alpha</option>
<option selected=""selected"" value=""1900/01/01 12:00:01 AM"">Bravo</option>
<option value=""1900/01/01 12:00:02 AM"">Charlie</option>
</select>",
Action = new Func<MvcHtmlString>(() => defaultValueHelper.ListBox("foo", selectList))
}
};
// Act && Assert
using (HtmlHelperTest.ReplaceCulture("en-ZA", "en-US"))
{
foreach (var test in tests)
{
Assert.Equal(test.Html, test.Action().ToHtmlString());
}
}
}
// Helpers
private class FooModel
{
public string foo { get; set; }
}
private class FooBarModel : FooModel
{
public string bar { get; set; }
}
private class NonIEnumerableModel
{
public int foo { get; set; }
}
private static ViewDataDictionary<FooBarModel> GetViewDataWithErrors()
{
ViewDataDictionary<FooBarModel> viewData = new ViewDataDictionary<FooBarModel> { { "foo", "ViewDataFoo" } };
viewData.Model = new FooBarModel { foo = "ViewItemFoo", bar = "ViewItemBar" };
ModelState modelStateFoo = new ModelState();
modelStateFoo.Errors.Add(new ModelError("foo error 1"));
modelStateFoo.Errors.Add(new ModelError("foo error 2"));
viewData.ModelState["foo"] = modelStateFoo;
modelStateFoo.Value = new ValueProviderResult(new string[] { "Bravo", "Charlie" }, "Bravo", CultureInfo.InvariantCulture);
return viewData;
}
internal static IEnumerable GetSampleCultureAnonymousObjects()
{
return new[]
{
new { Date = new DateTime(1900, 1, 1, 0, 0, 0), FullWord = "Alpha" },
new { Date = new DateTime(1900, 1, 1, 0, 0, 1), FullWord = "Bravo" },
new { Date = new DateTime(1900, 1, 1, 0, 0, 2), FullWord = "Charlie" }
};
}
private class RequiredModel
{
[Required]
public string foo { get; set; }
}
}
}