【问题标题】:System.Web.Mvc.SelectList doesn't work with byte[]System.Web.Mvc.SelectList 不适用于 byte[]
【发布时间】:2017-07-20 07:40:40
【问题描述】:

我正在尝试使用 SelectList 将 byte[] 作为值和字符串作为文本传递给 Html.DropDownList。但是,与下拉列表中的文本关联的值显示为“System.Byte[]”。这会导致模型绑定问题,从而导致以下异常:

输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或非法字符 在填充字符之间。

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.FormatException:输入无效 Base-64 字符串,因为它包含一个非 base 64 字符,超过两个 填充字符,或填充中的非法字符 字符。

  1. 我创建了一个 BAModel 列表
  2. 在创建操作中,我将列表保存为 ViewBag.site_OID
  3. 然后在视图中我使用@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


【解决方案1】:

答案是你不能。 SelectListItem 需要字符串值,所以如果你真的想存储为字节数组,你需要转换为Base64String

public class BAModel
{
    public string mfg_site_OID { get; set; }
    public string mfg_site_id { get; set; }
}

mfg_site_OID = Convert.ToBase64String(new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 })

然后在回发时转换回字节数组以获取原始值。

如果你想进一步了解 MVC 中的 DropDownList,我建议你看看这个answer

【讨论】:

  • 应该注意的是,这样做通常是一个非常的想法。使用 byte[] 作为您的值意味着您必须实际发送嵌入在 HTML 文档中的所有这些数据。更糟糕的是,由于您必须转换为 Base64 才能实际执行此操作,因此您包含在 HTML 中的数据扩展了大约 150%,因为 Base64 将使用字符串中的多个字节来编码数组中的单个字节。根据这些字节数组的大小,您可能会强制下载兆字节甚至千兆字节来呈现 HTML 文档。换句话说,不要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多