【发布时间】:2017-07-20 07:40:40
【问题描述】:
我正在尝试使用 SelectList 将 byte[] 作为值和字符串作为文本传递给 Html.DropDownList。但是,与下拉列表中的文本关联的值显示为“System.Byte[]”。这会导致模型绑定问题,从而导致以下异常:
输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或非法字符 在填充字符之间。
描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。
异常详细信息:System.FormatException:输入无效 Base-64 字符串,因为它包含一个非 base 64 字符,超过两个 填充字符,或填充中的非法字符 字符。
- 我创建了一个 BAModel 列表
- 在创建操作中,我将列表保存为 ViewBag.site_OID
- 然后在视图中我使用@Html.DropDownList 中ViewBag 中的上述项目
型号:
public class BAModel
{
public byte[] mfg_site_OID { get; set; }
public string mfg_site_id { get; set; }
}
行动:
public ActionResult Create()
{
//ViewBag.site_OID = new SelectList(db.mfg_site, "mfg_site_OID", "mfg_site_id");
var BAList = new List<BAModel>();
BAList.Add(new BAModel { mfg_site_OID= new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }, mfg_site_id ="london" });
BAList.Add(new BAModel { mfg_site_OID = new byte[] { 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21 }, mfg_site_id = "new york" });
ViewBag.site_OID = new SelectList(BAList, "mfg_site_OID", "mfg_site_id");
return View();
}
视图中的相关代码:
@{
ViewBag.Title = "Create";
SelectList list = ViewBag.site_OID;
}
<div class="form-group">
@Html.LabelFor(model => model.site_OID, "site_OID", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("site_OID", list, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.site_OID, "", new { @class = "text-danger" })
</div>
</div>
所以看起来new SelectList(BAList, "mfg_site_OID", "mfg_site_id") 转换为 DropDownList 时不理解 byte[] 而是使用数据类型。向使用 byte[] 作为 DropDownList 项的值的任何人寻求有关如何解决此问题的帮助。
【问题讨论】:
-
不能用字符串吗?
-
我用模拟模型简化了这个问题,但实际上我正在处理一个预先存在的 SQL Server 数据库,其中包含二进制类型的 OID 列。二进制在 .Net 模型中变成 byte[]。
-
二进制列中存储了什么?该表没有任何可用于绑定到下拉列表的主键列?
标签: c# razor asp.net-mvc-5