Correct `CheckBoxFor` to ignore `ViewData`

- #1483
- update tests to match

nits:
- cover a couple more `CheckBoxFor` test cases
- capitalize "CheckBox" consistently
This commit is contained in:
Doug Bunting 2015-01-16 17:20:34 -08:00
parent 80ada8d01b
commit 12565daf88
2 changed files with 55 additions and 19 deletions

View File

@ -117,13 +117,14 @@ namespace Microsoft.AspNet.Mvc.Rendering
htmlAttributeDictionary.Remove("checked"); htmlAttributeDictionary.Remove("checked");
} }
// Use ViewData only in CheckBox case (metadata null) and when the user didn't pass an isChecked value.
return GenerateInput( return GenerateInput(
viewContext, viewContext,
InputType.CheckBox, InputType.CheckBox,
metadata, metadata,
name, name,
value: "true", value: "true",
useViewData: !explicitValue, useViewData: (metadata == null && !explicitValue),
isChecked: isChecked ?? false, isChecked: isChecked ?? false,
setId: true, setId: true,
isExplicitValue: false, isExplicitValue: false,

View File

@ -11,7 +11,7 @@ using Xunit;
namespace Microsoft.AspNet.Mvc.Rendering namespace Microsoft.AspNet.Mvc.Rendering
{ {
public class HtmlHelperCheckboxTest public class HtmlHelperCheckBoxTest
{ {
[Fact] [Fact]
public void CheckBoxOverridesCalculatedValuesWithValuesFromHtmlAttributes() public void CheckBoxOverridesCalculatedValuesWithValuesFromHtmlAttributes()
@ -214,16 +214,46 @@ namespace Microsoft.AspNet.Mvc.Rendering
} }
[Fact] [Fact]
public void CheckBoxForWithInvalidBooleanThrows() public void CheckBoxForWithNullContainer_TreatsBooleanAsFalse()
{ {
// Arrange // Arrange
var expected = "String was not recognized as a valid Boolean."; var expected = @"<input id=""Property1"" name=""Property1"" type=""checkbox"" value=""true"" />" +
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData()); @"<input name=""Property1"" type=""hidden"" value=""false"" />";
var viewData = GetTestModelViewData();
var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData);
var valueProviderResult = new ValueProviderResult("false", "false", CultureInfo.InvariantCulture);
viewData.ModelState.SetModelValue("Property1", valueProviderResult);
// Act & Assert // Act
// "Property2" in ViewData isn't a valid boolean var html = helper.CheckBoxFor(m => m.Property1);
var ex = Assert.Throws<FormatException>(() => helper.CheckBoxFor(m => m.Property2));
Assert.Equal(expected, ex.Message); // Assert
Assert.Equal(expected, html.ToString());
}
[Theory]
[InlineData(false, "")]
[InlineData(true, "checked=\"checked\" ")]
public void CheckBoxForWithNonNullContainer_UsesPropertyValue(bool value, string expectedChecked)
{
// Arrange
var expected = @"<input {0}id=""Property1"" name=""Property1"" type=""checkbox"" value=""true"" />" +
@"<input name=""Property1"" type=""hidden"" value=""false"" />";
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] [Fact]
@ -262,15 +292,20 @@ namespace Microsoft.AspNet.Mvc.Rendering
Assert.Equal(expected, html.ToString()); Assert.Equal(expected, html.ToString());
} }
[Fact] [Theory]
public void CheckBoxForUsesModelStateAttemptedValue() [InlineData("false", "")]
[InlineData("true", "checked=\"checked\" ")]
public void CheckBoxFor_UsesModelStateAttemptedValue(string attemptedValue, string expectedChecked)
{ {
// Arrange // Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""checkbox"" value=""true"" />" + var expected = @"<input {0}id=""Property1"" name=""Property1"" type=""checkbox"" value=""true"" />" +
@"<input name=""Property1"" type=""hidden"" value=""false"" />"; @"<input name=""Property1"" type=""hidden"" value=""false"" />";
expected = string.Format(expected, expectedChecked);
var viewData = GetTestModelViewData(); var viewData = GetTestModelViewData();
var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData); 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); viewData.ModelState.SetModelValue("Property1", valueProviderResult);
// Act // Act
@ -281,10 +316,10 @@ namespace Microsoft.AspNet.Mvc.Rendering
} }
[Fact] [Fact]
public void CheckBoxForWithObjectAttributeWithUnderscores() public void CheckBoxFor_WithObjectAttribute_MapsUnderscoresInNamesToDashes()
{ {
// Arrange // Arrange
var expected = @"<input checked=""checked"" id=""Property1"" name=""Property1"" " + var expected = @"<input id=""Property1"" name=""Property1"" " +
@"Property1-Property3=""Property3ObjValue"" type=""checkbox"" value=""true"" /><input " + @"Property1-Property3=""Property3ObjValue"" type=""checkbox"" value=""true"" /><input " +
@"name=""Property1"" type=""hidden"" value=""false"" />"; @"name=""Property1"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData()); var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
@ -298,10 +333,10 @@ namespace Microsoft.AspNet.Mvc.Rendering
} }
[Fact] [Fact]
public void CheckBoxForWithAttributeDictionary() public void CheckBoxForWith_AttributeDictionary_GeneratesExpectedAttributes()
{ {
// Arrange // Arrange
var expected = @"<input checked=""checked"" id=""Property1"" name=""Property1"" " + var expected = @"<input id=""Property1"" name=""Property1"" " +
@"Property3=""Property3Value"" type=""checkbox"" value=""true"" /><input " + @"Property3=""Property3Value"" type=""checkbox"" value=""true"" /><input " +
@"name=""Property1"" type=""hidden"" value=""false"" />"; @"name=""Property1"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData()); var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
@ -333,10 +368,10 @@ namespace Microsoft.AspNet.Mvc.Rendering
} }
[Fact] [Fact]
public void CheckboxForWithComplexExpressionsUsesValuesFromViewDataDictionary() public void CheckBoxFor_WithComplexExpressions_DoesNotUseValuesFromViewDataDictionary()
{ {
// Arrange // Arrange
var expected = @"<input checked=""checked"" id=""ComplexProperty_Property1"" name=""ComplexProperty." + var expected = @"<input id=""ComplexProperty_Property1"" name=""ComplexProperty." +
@"Property1"" type=""checkbox"" value=""true"" /><input name=""ComplexProperty.Property1"" " + @"Property1"" type=""checkbox"" value=""true"" /><input name=""ComplexProperty.Property1"" " +
@"type=""hidden"" value=""false"" />"; @"type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetModelWithValidationViewData()); var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetModelWithValidationViewData());