DropDownListFor的种种纠结(禁止转载)

时间:2021-07-12 20:39:01

严重禁止转载,好多爬虫软件为了浏览到处抓东西,真缺德

具有键“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的数据,以至于报错