diff --git a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/DefaultHtmlGenerator.cs b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/DefaultHtmlGenerator.cs index b666940b67..5f3c565b9a 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/DefaultHtmlGenerator.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/DefaultHtmlGenerator.cs @@ -117,13 +117,14 @@ namespace Microsoft.AspNet.Mvc.Rendering htmlAttributeDictionary.Remove("checked"); } + // Use ViewData only in CheckBox case (metadata null) and when the user didn't pass an isChecked value. return GenerateInput( viewContext, InputType.CheckBox, metadata, name, value: "true", - useViewData: !explicitValue, + useViewData: (metadata == null && !explicitValue), isChecked: isChecked ?? false, setId: true, isExplicitValue: false, diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperCheckboxTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperCheckboxTest.cs index be8ea71cc8..2ce35c5b1d 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperCheckboxTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/HtmlHelperCheckboxTest.cs @@ -11,7 +11,7 @@ using Xunit; namespace Microsoft.AspNet.Mvc.Rendering { - public class HtmlHelperCheckboxTest + public class HtmlHelperCheckBoxTest { [Fact] public void CheckBoxOverridesCalculatedValuesWithValuesFromHtmlAttributes() @@ -214,16 +214,46 @@ namespace Microsoft.AspNet.Mvc.Rendering } [Fact] - public void CheckBoxForWithInvalidBooleanThrows() + public void CheckBoxForWithNullContainer_TreatsBooleanAsFalse() { // Arrange - var expected = "String was not recognized as a valid Boolean."; - var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData()); + var expected = @"" + + @""; + var viewData = GetTestModelViewData(); + var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData); + var valueProviderResult = new ValueProviderResult("false", "false", CultureInfo.InvariantCulture); + viewData.ModelState.SetModelValue("Property1", valueProviderResult); - // Act & Assert - // "Property2" in ViewData isn't a valid boolean - var ex = Assert.Throws(() => helper.CheckBoxFor(m => m.Property2)); - Assert.Equal(expected, ex.Message); + // Act + var html = helper.CheckBoxFor(m => m.Property1); + + // Assert + Assert.Equal(expected, html.ToString()); + } + + [Theory] + [InlineData(false, "")] + [InlineData(true, "checked=\"checked\" ")] + public void CheckBoxForWithNonNullContainer_UsesPropertyValue(bool value, string expectedChecked) + { + // Arrange + var expected = @"" + + @""; + expected = string.Format(expected, expectedChecked); + + var viewData = GetTestModelViewData(); + viewData.Model = new TestModel + { + Property1 = value, + }; + + var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData); + + // Act + var html = helper.CheckBoxFor(m => m.Property1); + + // Assert + Assert.Equal(expected, html.ToString()); } [Fact] @@ -262,15 +292,20 @@ namespace Microsoft.AspNet.Mvc.Rendering Assert.Equal(expected, html.ToString()); } - [Fact] - public void CheckBoxForUsesModelStateAttemptedValue() + [Theory] + [InlineData("false", "")] + [InlineData("true", "checked=\"checked\" ")] + public void CheckBoxFor_UsesModelStateAttemptedValue(string attemptedValue, string expectedChecked) { // Arrange - var expected = @"" + + var expected = @"" + @""; + expected = string.Format(expected, expectedChecked); + var viewData = GetTestModelViewData(); var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData); - var valueProviderResult = new ValueProviderResult("false", "false", CultureInfo.InvariantCulture); + var valueProviderResult = + new ValueProviderResult(attemptedValue, attemptedValue, CultureInfo.InvariantCulture); viewData.ModelState.SetModelValue("Property1", valueProviderResult); // Act @@ -281,10 +316,10 @@ namespace Microsoft.AspNet.Mvc.Rendering } [Fact] - public void CheckBoxForWithObjectAttributeWithUnderscores() + public void CheckBoxFor_WithObjectAttribute_MapsUnderscoresInNamesToDashes() { // Arrange - var expected = @""; var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData()); @@ -298,10 +333,10 @@ namespace Microsoft.AspNet.Mvc.Rendering } [Fact] - public void CheckBoxForWithAttributeDictionary() + public void CheckBoxForWith_AttributeDictionary_GeneratesExpectedAttributes() { // Arrange - var expected = @""; var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData()); @@ -333,10 +368,10 @@ namespace Microsoft.AspNet.Mvc.Rendering } [Fact] - public void CheckboxForWithComplexExpressionsUsesValuesFromViewDataDictionary() + public void CheckBoxFor_WithComplexExpressions_DoesNotUseValuesFromViewDataDictionary() { // Arrange - var expected = @""; var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetModelWithValidationViewData());