严重禁止转载,好多爬虫软件为了浏览到处抓东西,真缺德
具有键“CorpType”的 ViewData 项属于类型“System.Int64”,但它必须属于类型“IEnumerable<SelectListItem>"
先吐槽,不是不依赖微软的东西,是我对微软的类库实在有种排斥感,有些东西错了又找不到原因,这个问题就找了5个小时
网上硬是没有解决办法,因为技术总监的缘故就得照着做,无奈~~~~~~
问题如下:
public class CorpModel { [Required] [Display(Name = "公司名称")] public string CorpName { get; set; } [Required] [Display(Name = "公司类型")] public long CorpType { get; set; } }
public ActionResult AddCorporation() { var temp = dropDownListService.InitCorpTypeDropDownList11(); ViewData["Types"] = new SelectList(temp, "ID", "Name"); ; return View(corptype); }
<div class="form-group"> @Html.LabelFor(model => model.CorpType, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownListFor(u => u.CorpType,Model.CorpTypeList , "-- Select Contact --", new { @class = "form-control", required = "true" }) @Html.ValidationMessageFor(model => (SelectList)ViewData["Types"], "", new { @class = "text-danger" }) </div> </div>
第一次调用的时候是没问题的
[HttpPost] public ActionResult AddCorporation(CorpModel corp) { var currentUser = HttpContext.Session[Constants.USER_KEY] as USP.Models.POCO.User; if (ModelState.IsValid) { AjaxResult result = sysCorpBll.AddCorporation(corp.CorpName, corp.CorpType, currentUser.SysCorp.ID); if (result.flag) { return RedirectToAction("Corporation", "Corp"); } } var temp = dropDownListService.InitCorpTypeDropDownList11();
ViewData["Types"] = new SelectList(temp, "ID", "Name"); ; return View("AddCorporation", corp); }
第二次就报上面异常了
最终的解决方案
再viewmodel中增加
public IEnumerable<SelectListItem> CorpTypeList { get; set; }
public class CorpModel { [Required] [Display(Name = "公司名称")] public string CorpName { get; set; } [Required] [Display(Name = "公司类型")] public long CorpType { get; set; } public IEnumerable<SelectListItem> CorpTypeList { get; set; } }
[HttpGet] public ActionResult AddCorporation() { //var temp = dropDownListService.InitCorpTypeDropDownList11(); //ViewData["Types"] = new SelectList(temp, "ID", "Name"); ; var temp = dropDownListService.InitCorpTypeDropDownList11(); CorpModel corptype = new CorpModel(); corptype.CorpTypeList = new SelectList(temp, "ID", "Name"); return View(corptype); } [HttpPost] public ActionResult AddCorporation(CorpModel corp) { var currentUser = HttpContext.Session[Constants.USER_KEY] as USP.Models.POCO.User; if (ModelState.IsValid) { AjaxResult result = sysCorpBll.AddCorporation(corp.CorpName, corp.CorpType, currentUser.SysCorp.ID); if (result.flag) { return RedirectToAction("Corporation", "Corp"); } } var temp = dropDownListService.InitCorpTypeDropDownList11(); corp.CorpTypeList= new SelectList(temp, "ID", "Name"); return View("AddCorporation", corp); }
<div class="form-group"> @Html.LabelFor(model => model.CorpType, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownListFor(u => u.CorpType,Model.CorpTypeList , "-- Select Contact --", new { @class = "form-control", required = "true" }) @Html.ValidationMessageFor(model => model.CorpType, "", new { @class = "text-danger" }) </div> </div>
这样就可以避免这种问题了。。。
在前边用了一个Html.DropDownListFor方法渲染控件
结果报异常,用reflector跟了半天,结果调用了MVCForm的IDispose方法,我也是醉了
有一个页面用了同样的方法去调用,没问题,到这里就有了问题,我想了想因为是Dispose了顺便又调用了GC,所以页面要重新加载
所以在调用View的时候就得重新赋值给这里的return View("AddCorporation", corp);是没有DropDownList的数据,以至于报错