[Fixes #2336] Generate some input elements without value attribute

This commit is contained in:
Ajay Bhargav Baaskaran 2015-04-27 14:42:05 -07:00
parent 0a1918acac
commit 89ebce0289
4 changed files with 46 additions and 23 deletions

View File

@ -1024,7 +1024,23 @@ namespace Microsoft.AspNet.Mvc.Rendering
attributeValue = useViewData ? EvalString(viewContext, fullName, format) : valueParameter; attributeValue = useViewData ? EvalString(viewContext, fullName, format) : valueParameter;
} }
tagBuilder.MergeAttribute("value", attributeValue, replaceExisting: isExplicitValue); var addValue = true;
object typeAttributeValue;
if (htmlAttributes != null && htmlAttributes.TryGetValue("type", out typeAttributeValue))
{
if (string.Equals(typeAttributeValue.ToString(), "file", StringComparison.OrdinalIgnoreCase) ||
string.Equals(typeAttributeValue.ToString(), "image", StringComparison.OrdinalIgnoreCase))
{
// 'value' attribute is not needed for 'file' and 'image' input types.
addValue = false;
}
}
if (addValue)
{
tagBuilder.MergeAttribute("value", attributeValue, replaceExisting: isExplicitValue);
}
break; break;
} }

View File

@ -281,13 +281,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
format = GetFormat(modelExplorer, inputTypeHint, inputType); format = GetFormat(modelExplorer, inputTypeHint, inputType);
} }
object htmlAttributes = null; var htmlAttributes = new Dictionary<string, object>
{
{ "type", inputType }
};
if (string.Equals(inputType, "file") && string.Equals(inputTypeHint, TemplateRenderer.IEnumerableOfIFormFileName)) if (string.Equals(inputType, "file") && string.Equals(inputTypeHint, TemplateRenderer.IEnumerableOfIFormFileName))
{ {
htmlAttributes = new Dictionary<string, object> htmlAttributes["multiple"] = "multiple";
{
{ "multiple", "multiple" }
};
} }
return Generator.GenerateTextBox( return Generator.GenerateTextBox(

View File

@ -7,16 +7,16 @@
<h2>Input Tag Helper Test</h2> <h2>Input Tag Helper Test</h2>
<input name="InterfaceFile" type="file" id="InterfaceFile" value="" /> <input name="InterfaceFile" type="file" id="InterfaceFile" />
<input name="InterfaceFiles" type="file" id="InterfaceFiles" multiple="multiple" value="" /> <input name="InterfaceFiles" type="file" id="InterfaceFiles" multiple="multiple" />
<input name="ConcreteFile" type="file" id="ConcreteFile" value="" /> <input name="ConcreteFile" type="file" id="ConcreteFile" />
<input name="ConcreteFiles" type="file" id="ConcreteFiles" multiple="multiple" value="" /> <input name="ConcreteFiles" type="file" id="ConcreteFiles" multiple="multiple" />
<input name="EnumerableFiles" type="file" id="EnumerableFiles" multiple="multiple" value="" /> <input name="EnumerableFiles" type="file" id="EnumerableFiles" multiple="multiple" />
<input class="text-box single-line" id="InterfaceFile" name="InterfaceFile" type="file" value="" /> <input class="text-box single-line" id="InterfaceFile" name="InterfaceFile" type="file" />
<input class="text-box single-line" id="InterfaceFiles" multiple="multiple" name="InterfaceFiles" type="file" value="" /> <input class="text-box single-line" id="InterfaceFiles" multiple="multiple" name="InterfaceFiles" type="file" />
<input class="text-box single-line" id="ConcreteFile" name="ConcreteFile" type="file" value="" /> <input class="text-box single-line" id="ConcreteFile" name="ConcreteFile" type="file" />
<input class="text-box single-line" id="ConcreteFiles" multiple="multiple" name="ConcreteFiles" type="file" value="" /> <input class="text-box single-line" id="ConcreteFiles" multiple="multiple" name="ConcreteFiles" type="file" />
<input class="text-box single-line" id="EnumerableFiles" multiple="multiple" name="EnumerableFiles" type="file" value="" /> <input class="text-box single-line" id="EnumerableFiles" multiple="multiple" name="EnumerableFiles" type="file" />
</body> </body>
</html> </html>

View File

@ -623,6 +623,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
[InlineData("TEXT", null, "not-null")] [InlineData("TEXT", null, "not-null")]
[InlineData("custom-datatype", null, null)] [InlineData("custom-datatype", null, null)]
[InlineData(null, "unknown-input-type", "not-null")] [InlineData(null, "unknown-input-type", "not-null")]
[InlineData("Image", null, "not-null")]
[InlineData(null, "image", "not-null")]
public async Task ProcessAsync_CallsGenerateTextBox_WithExpectedParameters( public async Task ProcessAsync_CallsGenerateTextBox_WithExpectedParameters(
string dataTypeName, string dataTypeName,
string inputTypeName, string inputTypeName,
@ -695,7 +697,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
tagHelper.For.Name, tagHelper.For.Name,
model, // value model, // value
null, // format null, // format
null)) // htmlAttributes It.Is<Dictionary<string, object>>(m => m.ContainsKey("type")))) // htmlAttributes
.Returns(tagBuilder) .Returns(tagBuilder)
.Verifiable(); .Verifiable();
@ -791,13 +793,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var tagBuilder = new TagBuilder("input", new NullTestEncoder()); var tagBuilder = new TagBuilder("input", new NullTestEncoder());
Dictionary<string, object> htmlAttributes = null; var htmlAttributes = new Dictionary<string, object>
{
{ "type", expectedType }
};
if (string.Equals(dataTypeName, TemplateRenderer.IEnumerableOfIFormFileName)) if (string.Equals(dataTypeName, TemplateRenderer.IEnumerableOfIFormFileName))
{ {
htmlAttributes = new Dictionary<string, object> htmlAttributes["multiple"] = "multiple";
{
{ "multiple", "multiple" }
};
} }
htmlGenerator htmlGenerator
.Setup(mock => mock.GenerateTextBox( .Setup(mock => mock.GenerateTextBox(
@ -860,6 +862,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
SelfClosing = true, SelfClosing = true,
}; };
var htmlAttributes = new Dictionary<string, object>
{
{ "type", expectedType }
};
var metadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); var metadataProvider = TestModelMetadataProvider.CreateDefaultProvider();
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict); var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var tagHelper = GetTagHelper( var tagHelper = GetTagHelper(
@ -877,7 +883,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
tagHelper.For.Name, tagHelper.For.Name,
null, // value null, // value
expectedFormat, expectedFormat,
null)) // htmlAttributes htmlAttributes)) // htmlAttributes
.Returns(tagBuilder) .Returns(tagBuilder)
.Verifiable(); .Verifiable();