转:MVC3开发常常遇到的问题及常常使用到的代码片段

来源:互联网 发布:阿里云服务器端口开22 编辑:程序博客网 时间:2024/05/21 03:27

原文路径:http://www.cnblogs.com/firstcsharp/archive/2013/04/03/2997746.html

1、加密可用:

user.Password = Helper.EncryptPassword(newPass);

 2、在Model里限制数字大小范围:

[Range(0, 120,ErrorMessage="The Qty Available must be between 0 and 120.")]

 3、具有相同关键键值的字段设定方法(常常用在更新数据的时候):

复制代码
public class Boo{    [Key, ForeignKey("Foo")]    public string BooId{get;set;}    public Foo Foo{get;set;}}public class Foo{    public string FooId{get;set;}    public Boo Boo{get;set;}}
复制代码

解决的是象下面的情形:

4、Model中“邮箱、手机、密码“字段属性验证方法:

复制代码
        [DisplayName("密码确认:")]        [Required(ErrorMessage = "请再输入一次密码")]        [DataType(DataType.Password)]        [Compare("Password",ErrorMessage="密码和确认密码不相同,请重新输入!")]        public string ConfirmPassword { get; set; }        [DisplayName("Email地址:")]        [Required(ErrorMessage = "请输入您的邮箱地址,方便接受通知、验证邮件等")]        [RegularExpression(@"^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$", ErrorMessage = "邮箱格式不正确!请重新输入")]        public string Email { get; set; }        [DisplayName("手机号码:")]        [Required(ErrorMessage = "手机号不得为空")]        [RegularExpression(@"^(13[0-9]|15[0-9]|18[0-9])\d{8}$", ErrorMessage = "手机号码格式不正确!")]        public string Mobile { get; set; }
复制代码

 5、在Controller的获取参数为Guid类型时,是无法获取的,只能采用string类型的然后再进行转换为Guid类型的,方法如下:

 public ActionResult ChangePassword(string userid, ChangePasswordModel password)  {
Guid getuserid = new Guid(userid);
your code...
}

 6、如果在Get 的Controller里向View页面转值时,那么在HttpPost的Controller里一定要也要有逻辑表达,不然view出错时可能会丢失值,然后造成错误的出现。

 7、在View页面里ViewBag的动态传值方法:

 @if(ViewBag.Title!="用户中心") {@Html.ActionLink(">> "+ViewBag.Title as string,"UserInfo","Index",null,null)}

 8、使用aspnetdb数据库时不需要安装sqlexpress版本而使用本地数据库怎么?

2. 在Web.config文件的ConnectionStrings下加入一段连接字符串的配置:  <remove name="LocalSqlServer" />    <add name="LocalSqlServer" connectionString="Data Source=localhost;Initial Catalog=XXX;Persist Security Info=True;User ID=sa;Password=XXXX"        providerName="System.Data.SqlClient" />

 9、在View使用RenderAction注意事项:

要使用大括号和分号如:

<li>@{Html.RenderAction("CartSummary", "ShoppingCart");}</li>

 10、使用ViewBag时有时候字符串会被编码,比如“<”被编码成:&lt;解决办法如下:

@Html.raw(ViewBag.Strlabe);

只要在View页利用Html.Raw就行了

有些地方也许要这样使用:

@("<h1>asdfasd</h1>")@(new HtmlString( "<h1>asdfasd</h1>"))@(Html.Encode("<h1>asdfasd</h1>"))

判断语句中使用是: 

@Html.Raw(sitem.BillType==1? "<br/>自定义提单":"")

 

11、在li中选择一行时显示底色的方法:

复制代码
<!DOCTYPE html><html><head>  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>  <style type="text/css">#selectable .ui-selecting {    background: silver;}#selectable .ui-selected {    background: gray;}</style>  <script>  $(document).ready(function() {    $("#selectable").selectable();  });  </script></head><body style="font-size:62.5%;">  <ul id="selectable"><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li></ul></body></html>
复制代码

http://docs.jquery.com/UI/Selectable

完整效果地址:http://docs.jquery.com/UI

12、下拉菜单text自定义显示

要实现的样式如下图:

ViewBag.ProCode = new SelectList(_db.Products.Select(p => new { p.CodePro, protext = p.ProClass.Name + " | " + p.Material.Name + " | Φ" + p.Spec.Name }), "CodePro", "protext");

 

 @Html.DropDownListFor(model => model.CodePro, ViewBag.ProCode as SelectList, "--请选择--")

 13、多选框的另一种形式

<script src="@Url.Content("~/Script/jquery-1.7.1.min.js")" type="text/javascript"></script><script src="@Url.Content("~/Chosen/chosen.jquery.min.js")" type="text/javascript"></script><link href="@Url.Content("~/Chosen/chosen.css")" rel="stylesheet"  type="text/css" />
@Html.ListBox("CodeStore", ViewBag.StoresList as MultiSelectList, new { @class = "chzn-select", data_placeholder = "请选择仓库", style = "width:350px;" })
ViewBag.StoresList = new MultiSelectList(_db.Stores.Select(s => new { s.CodeStore, s.Name }),"CodeStore","Name");

相当关键的一处是:
它一定要放在页面的下面,不然不会起反映的

<script type="text/javascript">    $(".chzn-select").chosen(); </script>

 14、在Model里设定时间的显示格式方法

 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]  // Display date data field in the short format 11/12/08.Also, apply format in edit mode. public System.DateTime AddDate { get; set; }

 

 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd HH:mm:ss''}")]

 

复制代码
DisplayFormat使用说明格式字符 说明C 以货币格式显示数值D 以十进制格式显示数值。E 以科学记数法(指数)格式显示数值。F 以固定格式显示数值。G 以常规格式显示数值。N 以数字格式显示数值。X 以十六进制格式显示数值。格式日期:DataFormatString="{0: yyyy-MM-dd}"   注意这里的M一定要是大写!格式时间:DataFormatString="{0: hh:mm:ss}"  说明:大写的M是 Month,小写的m是minute ,注意区别大小写,C#里其它时候了是这样的用法,要区别大小写。格式字符串 输入 结果"{0:C}" 12345.6789 $12,345.68"{0:C}" -12345.6789 ($12,345.68)"{0:D}" 12345 12345"{0:D8}" 12345 00012345"{0:E}" 12345.6789 1234568E+004"{0:E10}" 12345.6789 1.2345678900E+004"{0:F}" 12345.6789 12345.68"{0:F0}" 12345.6789 12346"{0:G}" 12345.6789 12345.6789"{0:G7}" 123456789 1.234568E8"{0:N}" 12345.6789 12,345.68"{0:N4}" 123456789 123,456,789.0000"Total: {0:C}" 12345.6789 Total: $12345.68其常用的日期格式如下表所示:格式 说明 输出格式d 精简日期格式 MM/dd/yyyyD 详细日期格式 dddd, MMMM dd, yyyyf 完整格式 (long date + short time) dddd, MMMM dd, yyyy HH:mmF 完整日期时间格式 (long date + long time) dddd, MMMM dd, yyyy HH:mm:ssg 一般格式 (short date + short time) MM/dd/yyyy HH:mmG 一般格式 (short date + long time) MM/dd/yyyy HH:mm:ssm,M 月日格式 MMMM dds 适中日期时间格式 yyyy-MM-dd HH:mm:sst 精简时间格式 HH:mmT 详细时间格式 HH:mm:ss
复制代码

 15、jquery给文本框赋值

复制代码
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>    <script type="text/javascript">    jQuery(function(){         $("#txt1").blur( function () {             $("#txt2").val("");            $("#txt3").val("");            if($(this).val()<=10&&$(this).val()>0){                $("#txt2").val("一级");                $("#txt3").val("");            }         });     });</script>
复制代码

 16、让input没有缓存下拉值并只允许输入数字,其它字符无法输入

@Html.TextBox("PCS",null,new{ autocomplete="off" ,onkeyup="value=value.replace(/[^\\d]/g,'')" ,onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\\d]/g,''))"})

 17、清空input的内容的jquery写法

$("input").val(""); 

 18、等待几毫秒后再进行下面的操作

复制代码
//等待几毫秒函数    function sleep(numberMillis) {        var now = new Date();        var exitTime = now.getTime() + numberMillis;        while (true) {            now = new Date();            if (now.getTime() > exitTime)                return;        }    }
复制代码

 19、把字符型日期转换为日期型的方法
Convert.ToDateTime 方法 (String) 将日期和时间的指定字符串表示形式转换为等效的日期和时间值。

public static DateTime ToDateTime(    string value)

DateTime.Parse 方法 (String) 将日期和时间的指定字符串表示形式转换为其等效的 DateTime。

public static DateTime Parse(    string s)

 20、把Decimal类型保留 两位小数

decimal money1 = Decimal.Parse(Value.ToString("#0.00"));

 21、怎样解决:未找到路径“……”的控制器或该控制器未实现 IController?

@{Html.RenderAction("Cartsummary","ShoppingCart",new{area=""});}  
@Html.Action("MenuItems", "Common", new {area="" }) 

就是要加上new{area=""}

 22、当MVC添加区域的时候,如果在最外围的公共层_Layout.cshtml有链接到Area内的actionName和controllerName那么要这样写:

@Html.ActionLink("完善您的资料并提交证件申请正式会员>>", "RegMember", "Member", new { Area = "User" }, new { @class = "" })

其中User指的是Area内的其中一个区域,有时候Area内可能会有多个区域,比如:Mana、User、Pub等

23、Jquery把字符型数字转化为可以比较的数字类型

var datapcs = parseInt($("#PCS").val());

使用parseInt

 24、不允许使用浏览器的后退按钮(在有购物车的时候特别有用)
在Global.asax里添加如下代码:

protected  void  Application_BeginRequest(Object  sender,  EventArgs  e)  {         HttpContext.Current.Response.Cache.SetNoStore();  }

 25、怎样模糊查询当天全部日期包括当天的小时/秒/毫秒

复制代码
数据库中有A字段 DateTime类型存储的是 年月日 时分秒 问题:页面中输入 年月日 即模糊匹配 字段A 并返回所有包含此年月日的数据。例如:数据库中有以下数据 2011-01-01 120245 2011-01-02 120245 2011-01-01 120245 2011-01-03 120245页面搜索输入: 2011-01-01 即返回 2011-01-01 120245 2011-01-01 120245
复制代码

方法如下:

 DateTime? SearchTime =new DateTime(2011,1,1); var query = db.TableName.Where(w => System.Data.Objects.EntityFunctions.DiffDays(w.A, SearchTime) == 0);

 26、怎么处理MVC3中出现的“未将对象引用设置到对象的实例”所引发的异常?

在处理显示类时注意要用:@Html.DisplayFor(item=>item.User) 而不要直接使用:@Model.User
如果这样使用,当Model为空时就会引发上述异常!

27、Splic用法

复制代码
1、用字符串分隔: using System.Text.RegularExpressions;string str="aaajsbbbjsccc";string[] sArray=Regex.Split(str,"js",RegexOptions.IgnoreCase);foreach (string i in sArray) Response.Write(i.ToString() + "<br>");输出结果:aaabbbccc2、用多个字符来分隔:string str="aaajbbbscccjdddseee"; string[] sArray=str.Split(new char[2] {'j','s'}); foreach(string i in sArray) Response.Write(i.ToString() + "<br>"); 输出结果:aaabbbcccdddeee3、用单个字符来分隔:string str="aaajbbbjccc";string[] sArray=str.Split('j');foreach(string i in sArray) Response.Write(i.ToString() + "<br>");输出结果:aaabbbccc  ////////////////////////////////////////////////string[] arr = str.Split("o");这是一个具有语法错误的语句,Split 的 separator 参数应该是 char[] 或 string[],不应是字符串。正确的示例:string str = "technology";char[] separator = { 'o' };string[] arr = str.Split(separator);////////////////////////////////////////////////////String.Split 方法有6个重载函数:程序代码 1) public string[] Split(params char[] separator)2) public string[] Split(char[] separator, int count)3) public string[] Split(char[] separator, StringSplitOptions options)4) public string[] Split(string[] separator, StringSplitOptions options)5) public string[] Split(char[] separator, int count, StringSplitOptions options)6) public string[] Split(string[] separator, int count, StringSplitOptions options) 下边我们通过一些实例来说明下怎么使用(以下string words = "1,2.3,,4";):1. public string[] Split(params char[] separator)程序代码 string[] split = words.Split(new Char[] { ',' });//返回:{"1","2.3","","4"}string[] split = words.Split(new Char[] { ',', '.' });//返回:{"1","2","3","","4"} 2. public string[] Split(char[] separator, int count)程序代码 string[] split = words.Split(new Char[] { ',', '.' }, 2);//返回:{"1","2.3,,4"}string[] split = words.Split(new Char[] { ',', '.' }, 6);//返回:{"1","2","3","","4"} 3. public string[] Split(char[] separator, StringSplitOptions options)程序代码 string[] split = words.Split(new Char[] { ',', '.' }, StringSplitOptions.RemoveEmptyEntries);//返回:{"1","2","3","4"} 不保留空元素string[] split = words.Split(new Char[] { ',', '.' }, StringSplitOptions.None);//返回:{"1","2","3","","4"} 保留空元素 4. public string[] Split(string[] separator, StringSplitOptions options)程序代码 string[] split = words.Split(new string[] { ",", "." }, StringSplitOptions.RemoveEmptyEntries);//返回:{"1","2","3","4"} 不保留空元素string[] split = words.Split(new string[] { ",", "." }, StringSplitOptions.None);//返回:{"1","2","3","","4"} 保留空元素 5. public string[] Split(char[] separator, int count, StringSplitOptions options)程序代码 string[] split = words.Split(new Char[] { ',', '.' }, 2, StringSplitOptions.RemoveEmptyEntries);//返回:{"1","2.3,,4"} 不保留空元素string[] split = words.Split(new Char[] { ',', '.' }, 6, StringSplitOptions.None);//返回:{"1","2","3","","4"} 保留空元素 6. public string[] Split(string[] separator, int count, StringSplitOptions options)程序代码 string[] split = words.Split(new string[] { ",", "." }, 2, StringSplitOptions.RemoveEmptyEntries);//返回:{"1","2.3,,4"} 不保留空元素string[] split = words.Split(new string[] { ",", "." }, 6, StringSplitOptions.None);//返回:{"1","2","3","","4"} 保留空元素 需要注意的是没有重载函数public string[] Split(string[] separator),所以我们不能像VB.NET那样使用words.Split(","),而只能使用words.Split(','
复制代码

 28、MVC3中删除“主表”其相关的“从表”也跟着删除或者更新的方法是:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) {   modelBuilder.Entity<User>() .HasRequired(e => e.UserMemship)   .WithRequiredPrincipal() .WillCascadeOnDelete(true);   base.OnModelCreating(modelBuilder); }

 29、点击多行中一个<td>里的内容可以下拉菜单

复制代码
<script type="text/javascript" language="javascript">    $(document).ready(function () {        $(".companyinfo").mouseenter(function () {            var txt = $(this).attr("id_data");            t_delay = setTimeout(function () {                $("#" + txt).fadeIn("slow");            }, 50);        });        $(".companyinfo").mouseleave(function () {            clearTimeout(t_delay);            var txt = $(this).attr("id_data");            $("#" + txt).fadeOut("slow");        });    });</script>
复制代码
复制代码
<style type="text/css">.companyinfo{position:relative; margin:0px;cursor:pointer; }.infocontent{ width:330px;  padding:2px 2px 2px 2px; background-color:#ffffff; border:#ACACAC solid 1px;position:absolute; top:26px;  z-index:99999;display:none; }.info_td{ text-align:right; background-color:#eeeeee}</style>
复制代码
复制代码
 <td  class="companyinfo" id_data="@item.UserId">@Html.DisplayFor(m=>item.UserMemship.Company)  <img src="/Content/images/prompt.png" alt="点击查看更多详情" />         <div   id="@item.UserId" class="infocontent">           <table>            <tr><td class="info_td">地址:</td><td>@Html.DisplayFor(m=>item.UserMemship.Address)</td></tr>            <tr><td class="info_td">法人:</td><td >@Html.DisplayFor(m=>item.UserMemship.LegalPerson)</td></tr>            <tr><td class="info_td">城市:</td><td>@Html.DisplayFor(m=>item.UserMemship.City.Name)</td></tr>            <tr><td class="info_td">注册资本:</td><td>@Html.DisplayFor(m=>item.UserMemship.RegCapital)</td></tr>            <tr><td class="info_td">开发银行:</td><td>@Html.DisplayFor(m=>item.UserMemship.OpeningBank)</td></tr>            <tr><td class="info_td">开户行:</td><td>@Html.DisplayFor(m=>item.UserMemship.DepositBank)</td></tr>            <tr><td class="info_td">开户账号:</td><td>@Html.DisplayFor(m=>item.UserMemship.AccountBank)</td></tr>            <tr><td class="info_td">税号:</td><td>@Html.DisplayFor(m => item.UserMemship.TaxNumber)</td></tr>           </table>           </div>         </td>
复制代码

 30、对于集合中重复的项,要过滤重复项,必须要配合Select命令:Distinct()才起作用。

 var materials_dis= _db.Products.Where(m => m.CodeClass == c).Select(p => new DDMaterial() { CodeMaterial = p.CodeMaterial, Name = p.Material.Name }).Distinct();   //过滤重复项,必须要配合Select命令:Distinct()才起作用。 var materials = materials_dis.ToList().Select(m => new SelectListItem() { Text = m.Name != null ? m.Name : "[没有数据]", Value = m.CodeMaterial});     return Json(materials, JsonRequestBehavior.AllowGet);

 31、根据不同的值显示不同的链接信息的方法
可以使用Url:

<a href="@Url.Action(...)">LinkText</a>

然后再使用自定义的@helper函数来判断LinkText应该怎么显示

32、由于注册两个相同的控制器而出现无法找到匹配的控制的错误,如:

 // 找到多个与名为“Order”的控制器匹配的类型。如果为此请求(“{controller}/{action}/{id}”)提供服务的路由在搜索匹配此请求的控制器时没有指定命名空间,则会发生此情况。如果是这样,请通过调用含有“namespaces”参数的“MapRoute”方法的重载来注册此路由。                //“Order”请求找到下列匹配的控制器:                //Proweb.Areas.Mana.Controllers.OrderController                //Proweb.Controllers.OrderController

解决办法是“ManaAreaRegistration.cs”和“Global.asax”分别加上Router的命名空间即可,如下:
在根下加:new string[]{"Proweb.Controllers"}

 routes.MapRoute(                "Default", // 路由名称                "{controller}/{action}/{id}", // 带有参数的 URL                new { controller = "Home", action = "Index", id = UrlParameter.Optional },                 new string[]{"Proweb.Controllers"}

在Area的Mana下加:new string[] {"Proweb.Areas.Mana.Controllers"}

context.MapRoute(                "Mana_default",                "Mana/{controller}/{action}/{id}",                new {controller="Index", action = "Index", id = UrlParameter.Optional },                new string[] {"Proweb.Areas.Mana.Controllers"}

 33、Include在Linq To Entity中的作用
请看如下例子:
一个“风格流派”包含多个“专辑”,点击其中一个流派则可以返回此流派我多个列表


Models应该加List<Album>

复制代码
 public partial class Genre    {        public int GenreId { get; set; }        public string Name { get; set; }        public string Description { get; set; }        public List<Album> Albums { get; set; }        //如果不加这个会出现:指定的 Include 路径无效。EntityType“MvcMusicStore.Models.Genre”未声明具有名称“Albums”的导航属性。        //var genreModel = storeDB.Genres.Include("Albums").Single(g => g.Name == genre);    }
复制代码

 public ActionResult Browse(string genre)        {            var genreModel = storeDB.Genres.Include("Albums").Single(g => g.Name == genre);            //Include:指定要包括在查询结果中的相关对象,要在查询结果中返回的相关对象列表(以点号分隔)。参考:http://technet.microsoft.com/zh-cn/bb738708            return View(genreModel);        }
复制代码
@model MvcMusicStore.Models.Genre@{    ViewBag.Title = "Browse";}<h2>Browsing Genre: @Model.Name</h2><ul id="album-list">  @foreach (var album in Model.Albums)  {      <li>        <a href="@Url.Action("Details",new{id=album.AlbumId })"><img alt="@album.Title" src="@album.AlbumArtUrl" /></a>      </li>      <li>@Html.ActionLink(album.Title,"details",new{id=album.AlbumId})</li>  }</ul>
复制代码

 34、获取id值的方法

如果url是 /home/index?id=3 直接Request就ok。

但是如果路由设定为:{controller}/{action}/{id}

url是 /home/index/3 
这时想在页面View中获取参数id的值,该怎么获取? 

查了下资料好多人都利用Action获取到参数值后,用Viewdata传到View中
例如
Controlers中的phonelist这样定义 
public ActionResult phonelist(int id) 

ViewData["id"] = id; 
return View(); 


其实,没有必要,只要在view中这样获取就可以:

<%=Html.ViewContext.RouteData.Values["id"]%>

就算没有id的参数也不会报错。 

同样:

<%=Request.RequestContext.RouteData.Values["id"] %>和
<%=Html.ViewContext.RouteData.Route.GetRouteData(Html.ViewContext.HttpContext).Values["id"]%>也可以取到。

在用户控件中是无法直接访问到RouteData,RouteData是Page对象中的属性,

所以需要在用户控件中使用this.Page.RouteData来获取参数

使用this.Page.RouteData.Values["id"]来获取参数的值

35、小数点后显示两位小数的方法

float f=1.23456789;string d=f.ToString("#.00");  如果是计算的时候想保留可以这么弄:float f=1.23456789F;f=((int)Math.Round(f*100))/100.0F;  // f的结果为 1.23f.ToString("#.00");  //显示结果为1.23

 36、提交验证

复制代码
<script type="text/javascript">    function validate() {        var gimport = $("#import").val();        if (gimport == "") {            alert("请先选择文件!");            return false;        }    }</script>
复制代码
<input type="submit" value="开始导入!" name="save" onclick="javascript:return validate();"/>

 


0 0