我正在尝试使用SelectList将byte []作为值传递,将字符串作为文本传递给Html.DropDownList。但是,与下拉列表中的文本相关联的值显示为" System.Byte []"。这会导致模型绑定问题,从而导致以下异常:
输入不是有效的Base-64字符串,因为它包含非基数64 字符,两个以上的填充字符或非法字符 在填充字符中。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.FormatException:输入无效 Base-64字符串,因为它包含一个非基数64个字符,超过两个 填充字符,或填充中的非法字符 字符。
型号:
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项的值的任何人来解决这个问题的帮助。
答案 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。