MVC3開發常常遇到的問題及常常使用到的代碼片段


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/yyyy
D 詳細日期格式 dddd, MMMM dd, yyyy
f 完整格式 (long date + short time) dddd, MMMM dd, yyyy HH:mm
F 完整日期時間格式 (long date + long time) dddd, MMMM dd, yyyy HH:mm:ss
g 一般格式 (short date + short time) MM/dd/yyyy HH:mm
G 一般格式 (short date + long time) MM/dd/yyyy HH:mm:ss
m,M 月日格式 MMMM dd
s 適中日期時間格式 yyyy-MM-dd HH:mm:ss
t 精簡時間格式 HH:mm
T 詳細時間格式 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>");
輸出結果:
aaa
bbb
ccc
2、用多個字符來分隔:
string str="aaajbbbscccjdddseee"; 

string[] sArray=str.Split(new char[2] {'j','s'}); 
foreach(string i in sArray) Response.Write(i.ToString() + "<br>"); 
輸出結果:
aaa
bbb
ccc
ddd
eee
3、用單個字符來分隔:
string str="aaajbbbjccc";
string[] sArray=str.Split('j');
foreach(string i in sArray) Response.Write(i.ToString() + "<br>");
輸出結果:
aaa
bbb
ccc



 
 

////////////////////////////////////////////////

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();"/>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM