[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;
}
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;
}

View File

@ -281,13 +281,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
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))
{
htmlAttributes = new Dictionary<string, object>
{
{ "multiple", "multiple" }
};
htmlAttributes["multiple"] = "multiple";
}
return Generator.GenerateTextBox(

View File

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

View File

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