我有一个隐藏字段的html辅助方法。它绑定到一个byte [],我没有问题,因为它正确显示结果。但是如果我使用html标记而不是辅助函数,则不会显示正确的值。而是显示其类型。
以下代码和图片将阐明我想说的内容。
HTML code:
foreach (var path in Model.PathToImages)
{
<div class="form-group">
<div class="col-sm-6" style="vertical-align:central;">
<input type="button" value="Delete" class="btn btn-primary delete-property" name="@path.ImagePath" />
@Html.HiddenFor(m => path.ConcurrencyCheck)
<input id="@path.ImagePath" name="@path.ImagePath" type="hidden" value="@path.ConcurrencyCheck">
</div>
</div>
}
我模特中的属性:
public byte[] ConcurrencyCheck { get; set; }
忽略控件的名称和ID(这只是为了重现问题),以下是生成的html:
现在,当图像显示我使用@Html.HiddenFor(m => path.ConcurrencyCheck)
时,值正确显示但是当我使用<input id="@path.ImagePath" name="@path.ImagePath" type="hidden" value="@path.ConcurrencyCheck">
时,值为System.Byte []类型。
那么为什么我在使用html输入标签时没有获得该值,或者问题在于应该显示模型值的方式。
答案 0 :(得分:1)
这是因为byte[]
是一个复杂的数组,需要转换为Base64String
。 Html.HiddenFor()
方法考虑到了这一点,但@path.ConcurrencyCheck
没有,并且正在使用属性值的.ToString()
方法来生成输出。
您可以查看source code here,但相关的代码行是
private static MvcHtmlString HiddenHelper(HtmlHelper htmlHelper, ModelMetadata metadata, object value, bool useViewData, string expression, IDictionary<string, object> htmlAttributes)
{
....
byte[] byteArrayValue = value as byte[];
if (byteArrayValue != null)
{
value = Convert.ToBase64String(byteArrayValue);
}
....