System.Web.Mvc.SelectList不能与byte []

时间:2017-07-19 23:22:45

标签: c# razor asp.net-mvc-5

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

  

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

     

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

     

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

  1. 我创建了一个BAModel列表
  2. 在创建操作中,我将列表另存为ViewBag.site_OID
  3. 然后在视图中我使用@ Html.DropDownList中的ViewBag上面的项目
  4. 型号:

    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>
    

    因此,当转换为DropDownList时,似乎new SelectList(BAList, "mfg_site_OID", "mfg_site_id")不理解byte []并使用数据类型。寻找有关如何使用byte []作为DropDownList项的值的任何人来解决这个问题的帮助。

1 个答案:

答案 0 :(得分:0)

答案是你做不到的。 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