2017年3月28日 星期二

【FluentValidation】與MVC 5綁定Model Validation


MVC很早就提供Model Validation的驗證方式,只要在Parameter Class的Property加上限制
public class Movie {
    [Required]
    public int ID { get; set; }
   
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }

    [Range(1, 100)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }

    [StringLength(5)]
    public string Rating { get; set; }
}
接著在Action之中使用ModelState.IsValid即可驗證參數是否符合規定
[HttpPost]
public ActionResult Create(Movie movie)
{
    if (ModelState.IsValid)
    {
        db.Movies.Add(movie);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(movie);
}

最近比較習慣使用FluentValidation,剛好它也在MVC5上設定一下,就可以用ModelState.IsValid來得知參數驗證是否成功,以下紀錄實作方法



1.首先在MVC專案中安裝FluentValidation.MVC5

2.接著在Global  Application_Start加上
 FluentValidationModelValidatorProvider.Configure();


3.準備一個要驗證的參數類別
public class WantValidateParameter
{
   public string ID { get; set; }

   public string Name { get; set; }
}


4.跟前幾天提到的文章一樣,寫對應的驗證方法
 public class ParameterValidator :AbstractValidator<WantValidateParameter>
{
   public ParameterValidator()
   {
      this.RuleFor(x => x.ID)
      .NotNull()
      .WithErrorCode("400")
      .WithMessage("ID不能為Null")
      .NotEmpty()
      .WithErrorCode("400")
      .WithMessage("ID不能為空字串");

      this.RuleFor(x => x.Name)
      .NotNull()
      .WithErrorCode("401")
      .WithMessage("Name不能為Null")
      .NotEmpty()
      .WithErrorCode("401")
      .WithMessage("Name不能為空字串")
      .Length(4, 6)
      .WithErrorCode("401")
      .WithMessage("Name必須在4~6字之間");
   }
}

5.接著在剛剛要驗證的參數類別上加上Attribute
 [Validator(typeof(ParameterValidator))]
 public class WantValidateParameter
 {
    public string ID { get; set; }

    public string Name { get; set; }
 }

6.在Action裡面就可以用ModelState.IsValid來得知參數是否驗證成功啦!!
        public ActionResult Test(WantValidateParameter parameter)
        {
            string Result = string.Empty;
            if (!ModelState.IsValid)
            {
                //取得錯誤的訊息
                var Error = ModelState.Values.SelectMany(x => x.Errors).FirstOrDefault();
                Result = Error.ErrorMessage;
            }
            else
            {
                Result = "驗證成功";
            }

            return View(model: Result);
        }


參考文章 :
1.https://github.com/JeremySkinner/FluentValidation/wiki/h.-MVC
2.MSDN : Adding Validation to the Model

2017年3月21日 星期二

如何設定檔案、資料夾匿名驗證存取權限


每次討論到windows或是IIS權限都是我的弱項,碰到這類問題總是要搞個老半天,所以處理完趕緊來記錄一下!!

情境 :

同事希望某個資料夾下的Json檔案都不能被外部存取,但唯獨某一支有資訊安全問題,想要排除


解決方案:

一開始單純的想說透過IIS的驗證設定將該資料夾的匿名驗證停用,但這樣就變成所有在該資料夾底下的檔案都讀取不到了。


最後查了一下後,採取透過Web.config設定的方式來達成!!

  1. 首先在Web.config的system.webServer區段接入以下區段
    <handlers>
          <add name="JsonHandler" verb="*" path="*.json" type="System.Web.StaticFileHandler" resourceType="Unspecified" />
    </handlers>
    
  2. 接著在想要權限控管的那個資料夾底下加入一個新的web.config,並且寫入以下區段
    <?xml version="1.0"?>
    <configuration>
        <system.web>
          <authorization>
            <deny users="?" />
          </authorization>
        </system.web>
        <location path="xxx.json">    
        <system.web>
            <authorization>
                <allow users="?" />
            </authorization>
        </system.web>
        </location>
    </configuration>
    

    這邊稍微解釋一下意思,首先authorization區段底下寫著deny user="?",表示匿名驗證的使用者都無法存取。

    接著location path這段是表示,xxx.json,他的權限是可以允許(allow)匿名驗證者個存取。 

這樣設定完後進行測試,的確該資料夾底下的所以檔案都會無法直接讀取,並且跳出401權限驗證錯誤,而xxx.json雖然在同資料夾下,但卻是可以直接讀取檔案的


因為關於權限設定真的是肉腳一枚,如果有寫錯或觀念偏誤的地方,也歡迎留言指正教導,感激不盡!!!





2017年3月12日 星期日

【Extension Tools】SmartPaster


常常我會在SSMS上面撰寫SQL語法,等到確定之後才會把他挪到專案內,這時候就會碰到要補上前後雙引號或是跳脫字元等問題,以前都會笨笨的一行一行慢慢改,直到朋友介紹我一款好藥好套件SmartPaster



下載位置 : https://marketplace.visualstudio.com/items?itemName=martinw.SmartPaster2013


它的功用是做什麼呢? 我想直接看圖就一目了然了


只要你複製好任何字串,這邊以這串為例
select * 
from Employee
到VS裡面的時候點擊右鍵 >> Paste As... >> 選擇你要貼上的格式,登登~~~



自動就會幫你補上可以執行的程式了,不用再自己前後雙引號、跳脫字元等等,搞到格式大亂啦!!!! YES