最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。
十年河東十年河西,莫欺少年窮
學無止境,精益求精
最近在做自學MVC,遇到的問題很多,索性一點點總結下。
MVC4數據驗證:
本例以程序為例就行說明:
public class MyModel
{
[Required(ErrorMessage = "請輸入收件人姓名")]
public string Uname { get; set; }
[Required(ErrorMessage = "請輸入收貨人手機號")]
[RegularExpression(@"^1[3458][0-9]{9}$", ErrorMessage = "手機號格式不正確")]
public string UMoblie { get; set; }
[Required(ErrorMessage = "請選擇所屬省份")]
public string cmbProvince { get; set; }
[Required(ErrorMessage = "請選擇所屬市/縣")]
public string cmbCity { get; set; }
[Required(ErrorMessage = "請選擇所屬區域")]
public string cmbArea { get; set; }
public int moren { get; set; }
public string postnum { get; set; }
[Required(ErrorMessage = "請填寫詳細地址")]
public string AddressInfo { get; set; }
[RegularExpression(@"^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$", ErrorMessage = "請輸入正確的電子郵箱地址")]
public string Email { get; set; }
[StringLength(18, ErrorMessage = "身份證格式不正確!")]
public string cardNum { get; set; }//中國身份證號 18位
[StringLength(16, MinimumLength = 6, ErrorMessage = "密碼長度應在6~18位之間")]
[System.Web.Mvc.Compare("ConfimPassWords")]//二次輸入密碼必須和上次相同
public string NewPassWords { get; set; }//密碼長度 6~16位
[DataType(DataType.Password)]
[StringLength(16, MinimumLength = 6, ErrorMessage = "密碼長度應在6~18位之間")]
[System.Web.Mvc.Compare("NewPassWords")]//二次輸入密碼必須和上次相同
public string ConfimPassWords { get; set; }//密碼長度 6~16位
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
public decimal money { get; set; }// DisplayFormat特性可以用來處理屬性的各種格式化選項。當屬性包含空值時,可以提供可選的顯示文本,也可以為包含標記的屬性關閉HTML編碼,還可以為運行時指定一個應用於屬性值的格式化字符串。
[ReadOnly(true)]
public decimal Price { get; set; }//表示只讀的 不可修改
[Range(18, 60)]
public int Age { get; set; }//年齡范圍
// order 控制字段屬性的順序
[Required]
[StringLength(160)]
[Display(Name = "Last Name", Order = 15001)]
public string LastName { get; set; }
[Required]
[StringLength(160, MinimumLength = 3)]
[Display(Name = "First Name", Order = 15000)]
public string FirstName { get; set; }
}
MVC特性,本篇主要講解:Exclude、Include、Remote、HandleError、HiddenInput
表單提交中,如果我們不想提交某些屬性,我們可以使用Exclude特性來聲明
表單提交中,如果我們僅僅只提交某些屬性,我們可以使用Include特性來聲明
例如我們有如下Model
[Bind(Exclude="Address")]//在類上邊進行聲明,則針對所有引用該類的Action方法有效
public class Employee
{
public string Name { get; set; }
public string Email { get; set; }
public string Address { get; set; }
public string PhoneNo { get; set; }
}
提交表單時,我們不提交Address,那麼在Action方法中,我們獲取不到Address的值,如下所示:

當然,如果我們不是針對所有方法,而是僅僅針對一個方法,那麼我們可以將特性寫在方法上,如下所示:

除了上述:[Bind(Exclude="Address")]進行聲明,我們也可以使用Include進行聲明:
[Bind(Include = "Name,Email,PhoneNo")]//在類上邊進行聲明,則針對所有引用該類的Action方法有效
public class Employee
{
public string Name { get; set; }
public string Email { get; set; }
public string Address { get; set; }
public string PhoneNo { get; set; }
}
Remote特性講解
假設我們有一個注冊表單,裡面有郵箱文本框,當輸入郵箱後,我們想檢查輸入的郵箱是否在數據庫中已經存在,如果存在,則不提交表單,這時我們可以使用RemoteAttribute,通過RemoteAttribute,我們可以在不用提交表單就可以先進行一些服務端驗證。
我們可以在下面的例子中使用RemoteAttribute:
[Required]
[Remote("CheckUserName", "Home")]
public string UserName
{
get;
set;
}
RemoteAttribute的第一個參數是一個Action名字,第二個是Controller名字,第三個是如果郵箱已存在後顯示給用戶看的提示信息。當我們輸入完郵箱後,CheckEmail方法將被執行並檢查郵箱是否存在。
public JsonResult CheckUserName(string UserName)
{
bool result = true;
if (UserName == "admin")
{
result = false;
}
return Json(result,JsonRequestBehavior.AllowGet);
}
HandleError講解如下:
我們已經有很多方法在MVC中處理異常,比如用try catch,或者使用Filter,或者通過第三方庫比如elmah。但是MVC也提供了一個HandleErrorAttribute去處理異常,如下:
[HandleError()]
public ActionResult CheckError()
{
int a = 10;
int b = 0;
int k = a / b;
return View();
}
在web.config文件中,我們添加如下兩行:
<customErrors mode ="On" defaultRedirect ="Error.cshtml"> </customErrors>
在shared文件夾下創建一個視圖Error.cshtml,然後運行程序,如果運行上面的CheckError()方法,你剛創建的Error.cshtml將會顯示出來。
我們也可以使用HandleErrorAttribute給不同類型的異常顯示不同的視圖頁面。
[HandleError(ExceptionType=typeof(DivideByZeroException),View="DivideByZeroErrorView")]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "NullRefrenceErrorView")]
public ActionResult CheckError()
{
int a = 10;
int b = 0;
int k = a / b;
return View();
}
HiddenInput Attribute
如果我們想對用戶隱藏一些實體字段,我們可以使用HiddenInput特性。
public class Employee
{
[HiddenInput(DisplayValue=false)]
public string Name { get; set; }
[Remote("CheckEmail","Employee",ErrorMessage="Email is already exist")]
public string Email { get; set; }
public string Address { get; set; }
public string PhoneNo { get; set; }
}
在以上的實體中,我用HiddenInput特性去描述Name字段。這樣程序運行後在浏覽器中Name字段將不在顯示。因此HiddenInput給我們d 在實體字段上多了一些額外的控制。
C# 自動屬性:
在 C# 3.0 和更高版本中,當屬性的訪問器中不需要其他邏輯時,自動實現的屬性可使屬性聲明更加簡潔。
下面示例演示了屬性的標准實現和自動實現:
class Program {
class Person {
//標准實現的屬性
int _age;
public int Age {
get { return _age; }
set {
if (value < 0 || value > 130) {
Console.WriteLine("設置的年齡有誤!");
return;
}
_age = value;
}
}
//自動實現的屬性
public string Name { get; set; }
}
static void Main(string[] args) {
Person p = new Person();
p.Age = 180;
p.Name = "小王";
Console.WriteLine("{0}今年{1}歲。",p.Name,p.Age);
Console.ReadKey();
}
}
上面的自動屬性是控制年齡的范圍,很簡單!
再如我寫的自動截取字符串長度的屬性
/// <summary>
/// 積分榜
/// </summary>
public partial class YX_weiUserJF
{
private string nickName;
public string NickName
{
get { return nickName; }
set
{
nickName = value;
if (CommonMethod.GetStringLenth(nickName) > 16)
{
//當昵稱長度大於16位時,進行截取前兩位+ ... +後兩位
nickName = nickName.Substring(0, 2) + "..." + nickName.Substring(nickName.Length - 2, 2);
}
}
}
private int score;
public int Score
{
get { return score; }
set
{
score = value;
}
}
}
好了,就這麼多,很簡單吧!
參考:MVC常用特性使用
@陳臥龍的博客