相关代码可到下载:http://download.csdn.net/detail/akuoma/9921193
MVC开发前基础知识需知道:
1、MVC的寻址是通过:/App_Start/RouteConfig.cs 文件来控制的(相比较于以前的站点相对路径,现在统一到Views目录下进行寻址)。
2、理解: url: "{controller}/{action}/{id}" Controller即/Controllers文件夹里的那些继承了Controllers类的类文件;action 即这些类里面的返回类型为ActionResult的方法名。
3、Models:这个其实就是我们平时与表相对应的Model或Nhibernate里的Entity,就是实体;这个实体可以用你们自己平时用惯的实体就行,可以在其它类项目里,只需要在建View时选上对应的命名空间下的实体就行了。但要注意,要加一个构造方式传参进去给所有属性进行赋值。如:
public DepartmentInfo(int _id, Guid _gid)
{
this.ID = _id;
this.GID = _gid;
}
前面的基础知道了基本就能做MVC开发了,因为这个就是MVC的框架了,至于怎么与后台打交道,以前多层结构该怎么做还是怎么做就好;像在Action里的方法,除了返回需要是ActionResult外,如何从库里取到数据存放到Model 里按以前方式就行。
下面我记录一下开发过程中遇到的一些浅见及难点:
1、做一个表的列表展示界面,最直接的就是在返回ActionResult的Index方法中,return View()中直接返回View(Model[]),就是实体数组。这个简单一看就会了,但是很多时候,列表展示的内容会需要多表关联查询,为了这个功能单独去做个新的Model实体,不值,且开发过程中改动再所难免,改动起来也麻烦。于是我怀念起以前的DataSet绑定了;于是我们想办法把DataSet传到View界面去呗。ViewData["名称"]= DataTable 或 ViewBag.名称 = DataTable 就解决问题了。例子如下:
Controllers关键代码:
private WorkPostBLL bll = new WorkPostBLL();
public ActionResult List(int pageIndex,int pageSize)
{
DataSet ds = bll.GetListByPage2("", "", pageIndex, pageSize);//默认第一页,每页20
ViewBag.Count = int.Parse(ds.Tables[0].Rows[0][0].ToString());//总资料行数
ViewBag.data = ds.Tables[1];//当前页资料列表
return View(new WorkPostInfo());
}
View页面前键代码:
@model HSOA.Model.HS.HR.WorkPostInfo
@using System.Data;注:Veiw要加上这个,不然识别不到DataTable
注:然后就是这里了。
@if (ViewBag.data != null)
{
foreach (DataRow item in (ViewBag.data as DataTable).Rows)
{
<tr>
<td>
@item["Name"].ToString()
</td>
<td>
@item["Num"].ToString()
</td>
<td>
@(item["IsMaster"].ToString() == "1" ? "是" : "否")
</td>
<td>
@item["fullname"]
</td>
<td>
@item["Updateuser"].ToString()
</td>
<td>
@(item["UpdateTime"].ToString() == "" ? "" : DateTime.Parse("1970-1-1").AddSeconds(double.Parse(item["UpdateTime"].ToString())).ToString("yyyy-MM-dd"))
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item["ID"] })
</td>
</tr>
}
}
看到了吧,这个就是数据集的操作呀,在这里看就没有什么区别了吧。在这个列表界面,这样比用实例数组的要灵活很多。
2、MVC的无刷新操作:
无刷新,我们当然第一时间想到的肯定是AJAX了,或者是JQuery;C#WebForm的是调用微软的ScriptManager可简单实现;或JQuery读到到JSON后用JScript手工加上。MVC也有自己的无刷新技术,就是ActionResult不是返回View(WorkPostInfo[]),而是返回 return PartialView("ListSearch", new WorkPostInfo());
注:这里要多建一个View,但这个View是分部视图如下图:
关键代码如下:
分部视图Controler代码:
public ActionResult ListSearch(FormCollection collection)
{
string strWhere="";
DataSet ds = bll.GetListByPage2(strWhere, "", pageIndex, pageSize);//默认第一页,每页20
if (Request.IsAjaxRequest())
{
ViewBag.Count = int.Parse(ds.Tables[0].Rows[0][0].ToString());
ViewBag.data = ds.Tables[1];
return PartialView("ListSearch", new WorkPostInfo()); //直接返回数据视图层
}
return View(new WorkPostInfo());
}
分部视图View代码就不列出了,就是具体的你要做地刷新的数据,与你要做无刷新的那个界面的相同即可。
无刷新界面的Controler与View都按列表的做就行,但在View界面要加上相应的Script如下:
<script type="text/javascript">
//展示列表无刷新换页
function ajaxList(pageIndex, pageSize) {
var treeSelected = $("#hid_treeSelected").val();
var searname = $("#sh_Name").val();
var workpostid = $("#hid_WorkPostID").val();
$.ajax({
type: "POST",
async: false,
url: "/WorkPost/ListSearch",
data: { "pageIndex": pageIndex, "pageSize": pageSize, "hid_treeSelected": treeSelected, "sh_Name": searname, "hid_WorkPostID": workpostid },
success: function (data) {
//DataList1:是一个DIV,用来框住展示列表的。
$("#DataList1").html(data);
}
});
}
</script>
( 注:一些弹出窗口及下拉弹窗层,也同样可以通过这个方法完成。)
3、对于@Html的各种控件的使用,因我本身就懂BootStrap等,所以用起来没有什么大问题。其中需注意一些的有@Html.DropDownListFor等可绑定数据的控件,其实也简单如:
public ActionResult Create()
{
List<SelectListItem> lis = new List<SelectListItem> { new SelectListItem() { Value = "0", Text = "否" }, new SelectListItem() { Value = "1", Text = "是" } };
ViewData["IsMaster"] = lis.ToArray();
return View();
}
这里就绑定了有是否两项的下拉列表,是否被选中,可以加 Selected=true,一使用就知道的了。
在这个样例中,我还用到了zTree这个树型控件,全免费的一个树型控件,适用性也强,推荐使用。
以前WebAPI做了不少,但用MVC做的这是第一个项目,到现在刚好第5天了,就做了这么些,后面遇到新的不同知识点再记录上来。
相关图片:
1、无刷新部门树及无刷新列表(暂没做分页):
2、无刷新弹出框:
3、部门表加上部门岗位表树:
4、下拉框