积极答复者
There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'listname'.

问题
-
mvc 中, AbcController 代码:
public ActionResult Create() { List<SelectListItem> items = new List<SelectListItem>() { new SelectListItem(){Text="A", Value="a1", Selected = true}, new SelectListItem(){Text="B", Value="b1"}, }; ViewData["listname"] = new SelectList(items, "Value", "Text"); return View(); } [HttpPost] public ActionResult Create(FormCollection fc) {
Response.Write("<script type='text/javascript'>alert('aaa');</script >");
return View(); }
答案
-
MVC work different than ASP.Net, you need to rebind you model in Post action once again and pass it to your view.
List<SelectListItem> generateList() { return new List<SelectListItem>() { new SelectListItem(){Text="a", Value="a1", Selected = true}, new SelectListItem(){Text="b", Value="b1"}, }; } public ActionResult Register() { RegisterViewModel rv = new RegisterViewModel(); rv.Select = generateList(); return View(rv); } [HttpPost] public ActionResult Register(RegisterViewModel m) { RegisterViewModel rv = new RegisterViewModel(); rv.Select = generateList(); Response.Write("<script type='text/javascript'>alert('" + m.aaa + " ');</script >"); return View(rv); }
- 已标记为答案 fss199 2017年3月16日 1:30
全部回复
-
谢谢,不行啊
1)请问你的View页面还是指“Create”那个页面吗?
2)给出你的View的全部代码,谢谢。
ASP.NET Forum
StackOverFlow
FreeRice Donate
Issues to report
-
model:
public class RegisterViewModel { public IEnumerable<SelectListItem> aaa { get ; set; } }
view:
@model test.Models.RegisterViewModel @using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.DropDownListFor(m => m.aaa, ViewData["d"] as SelectList) <input type="submit" class="btn btn-default" value="注册" /> }
controls:
public ActionResult Register() { List<SelectListItem> items = new List<SelectListItem>() { new SelectListItem(){Text="a", Value="a1", Selected = true}, new SelectListItem(){Text="b", Value="b1"}, }; ViewData["d"] = new SelectList(items, "Value", "Text"); return View(); } [HttpPost] public async Task<ActionResult> Register(RegisterViewModel model) { //这里如何取到被选中的text }
-
请仔细看你的HTML生成源代码,记住<select>标签的name,然后如下替换:
public class FormModel { public string YourSelectTagName{get;set;} }
[HttpPost] public async Task<ActionResult> Register(FormModel model) { //处理你的逻辑…… }
ASP.NET Forum
StackOverFlow
FreeRice Donate
Issues to report
-
你错误理解我的意思了。你的Select生成的HTML代码应该如下:
<select name="aaa"> <option value="1">A</aoption> </select>
那么你不能修改RegisterModel,而是必须额外地增加一个Model,用于进行对于Select提交的数据绑定。请严格按照我的上面代码。
ASP.NET Forum
StackOverFlow
FreeRice Donate
Issues to report
-
[HttpPost] public ActionResult Create(FormModel fm) {
//Do your logic here.
}
ASP.NET Forum
StackOverFlow
FreeRice Donate
Issues to report
-
根据你View生成的HTML创建一个新的Model,然后作为Post提交。
其中属性名称必须和form中每一项的name对应。
ASP.NET Forum
StackOverFlow
FreeRice Donate
Issues to report
-
model:
public class RegisterViewModel { public IEnumerable<SelectListItem> aaa { get; set; } } public class FormModel { public string aaa { get; set; } }
controller:
public ActionResult Register() { List<SelectListItem> items = new List<SelectListItem>() { new SelectListItem(){Text="a", Value="a1", Selected = true}, new SelectListItem(){Text="b", Value="b1"}, }; ViewData["d"] = new SelectList(items, "Value", "Text"); return View(); } // // POST: /Account/Register [HttpPost] public ActionResult Register(RegisterViewModel m,FormModel model) { Response.Write("<script type='text/javascript'>alert('" + model.aaa.ToString() + " ');</script >");
//这里还是无法取到被选中的值 return View(); }
view:
@Html.DropDownListFor( x => x.aaa, ViewData["d"] as IEnumerable<SelectListItem>, "-- select a reason --" )
-
为什么你的Register有2个Model?只需要一个FormModel啊。请先保证无参数的那个Register返回的View生成的Select的HTML的name是“aaa”。
ASP.NET Forum
StackOverFlow
FreeRice Donate
Issues to report
-
view:
@Html.DropDownListFor(d => d.aaa, Model.Select,"-- select --")
生成后的html:
<select id="aaa" name="aaa"><option value="">-- select --</option> <option selected="selected" value="a1">a</option> <option value="b1">b</option> </select>
model:
public class RegisterViewModel { public IEnumerable<SelectListItem> Select { get; set; } public string aaa { get; set; } }
controls:
public ActionResult Register() { RegisterViewModel rv = new RegisterViewModel(); rv.Select = new List<SelectListItem>() { new SelectListItem(){Text="a", Value="a1", Selected = true}, new SelectListItem(){Text="b", Value="b1"}, }; return View(rv); } [HttpPost] public ActionResult Register(RegisterViewModel m) { Response.Write("<script type='text/javascript'>alert('" + m.aaa + " ');</script >"); return View(); }
提交后报错:
@Html.DropDownListFor(m => m.aaa, Model.Select, "-- select --")
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
-
MVC work different than ASP.Net, you need to rebind you model in Post action once again and pass it to your view.
List<SelectListItem> generateList() { return new List<SelectListItem>() { new SelectListItem(){Text="a", Value="a1", Selected = true}, new SelectListItem(){Text="b", Value="b1"}, }; } public ActionResult Register() { RegisterViewModel rv = new RegisterViewModel(); rv.Select = generateList(); return View(rv); } [HttpPost] public ActionResult Register(RegisterViewModel m) { RegisterViewModel rv = new RegisterViewModel(); rv.Select = generateList(); Response.Write("<script type='text/javascript'>alert('" + m.aaa + " ');</script >"); return View(rv); }
- 已标记为答案 fss199 2017年3月16日 1:30