当前在使用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(); } } } }