MVC 构造新Model实现内容搜索

当前在使用MVC开发一个网站,习惯了使用ASP.NET中控件,转到MVC之后突然对于页面和后台代码的传值感觉无从下手。花了点时间在网上看了写帖子后,想到了一个方法,重新构造一个新Model, 然后利用Model在页面和代码之间传值。

举例来说:

我数据库中有张学生表(Student),表中字段分别为:ID, StudentNo, StudentName, Gender, Birth, Domicile, Phone, Mail。相应的我的代码中有个名为Student的Model, 我想实现根据学生的学号,姓名,性别等条件从数据库中查询出符合条件的结果集。并将结果集在View中显示。

1。在View中提供输入框,使用户能够输入查询条件

2。在View中提供提交按钮,用户输入查询条件以后,点击提交按钮获得查询结果

3。难题出现了,如何将用户输入的查询条件传到Controler 代码中,并将查询到的结果返回到View中?

方法:

创建一个新Model,新Model比如取名叫Search,它包含两个部分,第一部分是查询条件(StuNo, StuName, Gender, ...),第二部分是查询结果(List<Student> StuResults).

创建基于Search类型的View,把Search传到View中,当点击提交按钮时,将 Search Model传到Controller,在Controller中得到Search类的查询条件,根据条件查询符合条件的Student的结果,将结果赋值给Search类的StuResults。然后将Search重新传回View。

代码:

新建Model

namespace CertTitle.Models
{
    public class Search
    {
        #region Search by Condition
        public string EntryID { get; set; }
        public string Title { get; set; }
        public string CDM { get; set; }
        public string Owner { get; set; }
        #endregion end of search condition

        #region Search Results
        public List<ExamEntry> ResultList { get; set; }
        #endregion end of search result
    }
}


Controller

        public ActionResult Lookup()
        {
            Search result = new Search();
            result.EntryID = "";
            result.Title = "";
            result.CDM = "";
            result.Owner = "";
            result.ResultList = new List<ExamEntry>();
            return View(result);
        }

        [HttpPost]
        public ActionResult Lookup(Search search)
        {
            string exam = search.EntryID;
            string keywordsInTitle = search.Title;
            string CDM = search.CDM;
            string AssignedTo = search.Owner;
            var results = db.ExamEntries.Where(e => (e.ExamID == exam||e.Title.Contains (keywordsInTitle)||
                e.CDM ==CDM ||e.AssignedTo == AssignedTo)).ToList();
            if (results != null)
                search.ResultList = results;
            return View(search);
        }


View

@using CertTitle.Models
@model CertTitle.Models.Search

@{
    ViewBag.Title = "Lookup";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Find Titles</h2>

<div>
    @using (Html.BeginForm())
    {
        <fieldset>
            <legend>Type Exam# which you want to find</legend>
            <div>
                Exam# @Html.TextBoxFor(model => model.EntryID) | Title @Html.TextBoxFor(model =>model.Title) | 
                CDM @Html.TextBoxFor(model => model.CDM) | Assigned To @Html.TextBoxFor(model => model.Owner) |<input type="submit" value="Search" />
            </div>
            <div>
                
            </div>
        </fieldset>
    }
</div>

<table id="tbInfo">
    <thead>
        <tr>
            <th>EXAM#</th>
            <th>VER</th>
            <th>LAN</th>
            <th>PjM</th>
            <th>CDM</th>           
            <th>Status</th>
            <th>REQUIRE</th>
            <th>ACTUAL</th>
            <th>ISSUE1</th>
            <th>ISSUE2</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.ResultList)
    {
            <tr>
                <td>@Html.ActionLink(@item.ExamID,"Detail",new {id = @item.ID})</td>
                <td>@item.Version</td>
                <td>@item.Language</td>
                <td>@item.PjM</td>
                <td>@item.CDM</td>               
                <td>@CertTitleHelper.TaskStatusConverter(@item.Status)</td>
                <td>@item.PlanFinishDate</td>
                <td>@item.ActualFinishDate</td>
                <td>
                    @Html.ActionLink(@item.IssueCount.ToString(),"ViewIssueByTitle","CertIssue",new {id = @item.ID},null)
                </td>
                <td>
                    @Html.ActionLink(@item.IssueCountToEDP.ToString(),"ViewIssueByTitle","CertIssue",new {id = @item.ID},null)
                </td>
                <td style=" 150px">
                    @Html.ActionLink("Edit","Edit",new{id = @item.ID}) |
                @Html.ActionLink("Missed Issue", "MissIssue", "CertIssue", new { id = @item.ID}, null)
                </td>
            </tr>
            <tr>
                <td></td>
                <td colspan="4">@item.Title</td>
                 <td>@item.AssignedTo</td>
            </tr>
    }
    </tbody>
</table>

View中使用到了一个

CertTitleHelper.TaskStatusConverter(int? )的方法,此方法根据一个Int型的值转换成相应的字符串值,例如枚举的转换。

 枚举在数据库中显示为Int,在页面中需要显示其字符串。转换代码如下

namespace CertTitle.Models
{
    public class CertTitleHelper
    {
        public static string TaskStatusConverter(int? status)
        {
            switch (status)
            {
                case (int)TaskStatus.NotAssigned:
                    return TaskStatus.NotAssigned.ToString();
                case (int)TaskStatus.Issues:
                    return TaskStatus.Issues.ToString();
                case (int)TaskStatus.InProgress:
                    return TaskStatus.InProgress.ToString();
                case (int)TaskStatus.Complete:
                    return TaskStatus.Complete.ToString();
                default:
                    return TaskStatus.NotAssigned.ToString();
            }
        }
    }
}
原文地址:https://www.cnblogs.com/qixue/p/3683253.html