显示列表框中的选定值(MVC)

时间:2014-03-13 13:18:21

标签: asp.net-mvc-4

我有数据库,它由表" 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]

英文消息 - 对象引用未设置为对象的实例。

请帮帮我!我做错了什么? 我该如何纠正?

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>

也应该解决这个问题。