我有数据库,它由表" Jobs":job_id(int,主键),job_nm(nchar(50))组成。 在"模型"文件夹我添加ADO.NET实体数据模型。
控制器是:
namespace ListBox_proj.Controllers
{
public class HomeController : Controller
{
myDBEntities1 db = new myDBEntities1();
[HttpGet]
public ActionResult Index()`enter code here`
{
var jobs = db.Jobs;
ViewBag.Jobs = jobs;
return View(jobs);
}
[HttpPost]
public ActionResult Index(string sel1)
{
ViewBag.Result = sel1;
return View();
}
}
}
查看是:
@{
ViewBag.Title = "Index";
}
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>Index</title>
</head>
<body>
<h1 class="label">Please, select the job you interested in:</h1> <br /><br />
<select name="sel1" id ="sel1">
<option>All</option>
@foreach (var j in ViewBag.Jobs)
{
<option><p>@j.job_nm</p></option>
}
</select>
<form action="/home/index" method="post">
<input type="submit" value ="Search">
<input type="text">@ViewBag.Result</input>
</form>
</body>
</html>
但是当我在选择框中选择项目并按下&#34;搜索&#34;时,我会收到错误消息:
![在此处输入图片说明] [1]
英文消息 - 对象引用未设置为对象的实例。
请帮帮我!我做错了什么? 我该如何纠正?
答案 0 :(得分:0)
这里有两个问题。
首先,ViewBag.Jobs
仅填充[HttpGet]
;您需要确保ViewBag
中也填充[HttpPost]
。更好的解决方案通常是使用适当的视图模型 - 例如,
public class JobViewModel {
public Jobs JobsList { get; set; }
public string Result { get; set; }
}
只需在[HttpGet]
和[HttpPost]
程序中填充该内容,然后将其传递到View()
来电。然后添加:
@model JobsViewModel
位于视图顶部,允许您通过(强类型)Model.JobsList
属性访问它。
您会遇到的第二个问题是sel
未提交,因为它不属于您的<form>
标记 - 请记住,表单中提交的唯一信息是包含的信息在其中。
将您的观点重组为:
<form action="/home/index" method="post">
<select name="sel1" id ="sel1">
<option>All</option>
@foreach (var j in Model.JobsList)
{
<option><p>@j.job_nm</p></option>
}
</select>
<input type="submit" value ="Search">
<input type="text">@Model.Result</input>
</form>
也应该解决这个问题。