ASP.NET MVC3 常用整理

在ASP.NET MVC 中获取当前URL、controller、action

一、 URL的获取很简单,ASP.NET通用: 
【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" } })

页面接收参数 ViewData["defaultID"]
 
四、下拉列表

比如我的主表是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、如果有相隔的区域,则照此方法多用几个注释标签,通过查找然后连接在一起。


posted @ 2012-07-27 17:50  AIの海雅  阅读(449)  评论(0编辑  收藏  举报