ASP.NET MVC3 常用整理
在ASP.NET MVC 中获取当前URL、controller、action
【1】获取 完整url (协议名+域名+虚拟目录名+文件名+参数)
string url=Request.Url.ToString();
【2】获取 虚拟目录名+页面名+参数:
string url=Request.RawUrl;
(或 string url=Request.Url.PathAndQuery;)
【3】获取 虚拟目录名+页面名:
string url=HttpContext.Current.Request.Url.AbsolutePath;
(或 string url= HttpContext.Current.Request.Path;)
【4】获取 域名:
string url=HttpContext.Current.Request.Url.Host;
【5】获取 参数:
string url= HttpContext.Current.Request.Url.Query;
【6】获取 端口:
Request.Url.Port
二、当前controller、action的获取
RouteData.Route.GetRouteData(this.HttpContext).Values["controller"]
RouteData.Route.GetRouteData(this.HttpContext).Values["action"]
或
RouteData.Values["controller"]
RouteData.Values["action"]
如果在视图中可以用
ViewContext.RouteData.Route.GetRouteData(this.Context).Values["controller"]
ViewContext.RouteData.Route.GetRouteData(this.Context).Values["action"]
或
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
@Html.Partial("_Menu_74", new ViewDataDictionary() { { "defaultID", "87" } })
比如我的主表是TCases,其中有字段AreaID是和表TAreas(字段:ID,Name)中的ID关联,在新建或修改主表记录时要给Area提供下拉列表以选择,此时的实现方法是:
Controller对应的Action中在return View之前加入
ViewBag.Area = new SelectList(db.TAreas, "ID", "Name");
在对应的View中加入
@Html.DropDownListFor(model => model.AreaID, ViewBag.Area as IEnumerable<SelectListItem>)
@Html.ValidationMessageFor(model => model.AreaID)
需要注意的2点:
1、ViewBag中变量的名称不要和字段名重复,比如上面就不要用ViewBag.AreaID,似乎这样会导致不会自动指定默认值。因为这个问题出现在初期,相距已经有些时日,不知道根本原因是否如此,反正当时是通过这样的修改解决了问题。
2、有时候提示如下之类错误:
具有键“AreaID”的 ViewData 项属于类型“System.Int32”,但它必须属于类型“IEnumerable<SelectListItem>”。
但实际上问题并不是在这个字段上。我当时是有一个字段是DateTime类型,长短日期不一致,还有有时是空等,这个是问题的原因所在。后来是把Model中DateTime类型改为DateTime?类型,再控制为短日期格式,问题解决。
在录入编辑界面,常用的方式如下:
@Html.EditorFor(model => model.PrivideTime)
但是这样就不能控制输入框属性。需要控制属性时就必须:
@Html.TextBox("PrivideTime", Model.PrivideTime.Value.ToShortDateString(), new { disabled = "disabled", @readonly = "readonly" })
其中也给出了以短日期格式显示的方法。
六、图片上传
上传图片可以采用如下方式:
@using (Html.BeginForm("About", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.ValidationSummary(true)
<p>
<input name="file" type="file" id="file1" /><input type="submit" value="上传图片" />
</p>
}
红色字体是要注意的地方,必须要有。
这里还有一个问题:同一个页面中,原本有一个保存按钮,现在又有了一个上传图片按钮,两个都是submit,在Controller中是如何区分呢?
通过
Request.Files.Count == 0
或者
var file = Request.Files[0];
if (file.ContentLength == 0)
这样是不能区分出来的。在没有选中文件就点“上传图片”或者点“保存”,上面的两个判断结果是一样的。
我当时采用了一个并不是很好的方法:
去掉“上传图片”按钮,选择了文件之后立即触发submit,这样就避免了没有选中文件就点“上传图片”这种情况。
<input name="file" type="file" id="file1" onchange="this.form.submit()" />
到了后期之后,发现其实 有更好的办法,用一个hidden存放标志,controller中获取该标志,根据值的不同进行区分。具体方法我在后面解决打印时会讲。
要求打印功能,目前似乎要求不高,利用浏览器自带的打印大体就差不多了,当然需要去掉一些多余的东西。
在网上找了一个很简单的方法:
function preview() {
bdhtml = window.document.body.innerHTML;
sprnstr = "<!--start";
eprnstr = "<!--end";
iprnstr="print-->"
prnhtml = bdhtml.substr(bdhtml.indexOf(sprnstr + iprnstr) + 17);
prnhtml = prnhtml.substring(0, prnhtml.indexOf(eprnstr + iprnstr));
window.document.body.innerHTML = prnhtml;
window.document.body.style.color = '#000000 ';
window.print;
}
……
<!—startprint—>
……这里就是需要打印的内容
<!--endprint-->
<input type= "button" id="btnPrint" name= "print" value= "预览并打印" onclick= "preview()" />
要注意的是:
1、不要直接设
sprnstr = "<!—startprint";
这样查找的时候就会找到jquery代码中的这一段文字了;
2、如果有相隔的区域,则照此方法多用几个注释标签,通过查找然后连接在一起。