Here are a few examples of some of the code differences.
Custom Validators:
namespace FSharpMVC2.Web.Models open System open System.ComponentModel.DataAnnotations open System.ComponentModel open System.Globalization open System.Web.Security [<AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)>] [<Sealed>] type PropertiesMustMatchAttribute = inherit ValidationAttribute val typeId : obj val mutable originalProperty : string val mutable confirmProperty : string new (originalProperty, confirmProperty) = {inherit ValidationAttribute("'{0}' and '{1}' do not match."); originalProperty = originalProperty; confirmProperty = confirmProperty; typeId = new Object()} member x.OriginalProperty with get() = x.originalProperty and set(value) = x.originalProperty <- value member x.ConfirmProperty with get() = x.confirmProperty and set(value) = x.confirmProperty <- value override x.TypeId with get() = x.typeId override x.FormatErrorMessage name = String.Format(CultureInfo.CurrentUICulture, x.ErrorMessageString, x.OriginalProperty, x.ConfirmProperty) override x.IsValid value = let properties = TypeDescriptor.GetProperties value let originalValue = properties.Find(x.OriginalProperty, true).GetValue(value) let confirmValue = properties.Find(x.ConfirmProperty, true).GetValue(value) Object.Equals(originalValue, confirmValue) [<AttributeUsage(AttributeTargets.Field ||| AttributeTargets.Property, AllowMultiple = false, Inherited = true)>] [<Sealed>] type ValidatePasswordLengthAttribute = val minCharacters : int new () = {inherit ValidationAttribute("'{0}' must be at least {1} characters long."); minCharacters = Membership.Provider.MinRequiredPasswordLength} inherit ValidationAttribute override x.FormatErrorMessage name = String.Format(CultureInfo.CurrentUICulture, x.ErrorMessageString, name, x.minCharacters) override x.IsValid value = let valueAsString = value :?> string (valueAsString <> null && valueAsString.Length >= x.minCharacters)Authentication and Membership Services:
namespace FSharpMVC2.Web.Models open System open System.Web.Security module InputValidation = let Validate stringValue errorMessage = match String.IsNullOrEmpty(stringValue) with | true -> failwith(errorMessage) | _ -> do "" |> ignore type IMembershipService = interface abstract MinPasswordLength : int with get abstract ValidateUser : string*string -> bool abstract CreateUser : string*string*string -> MembershipCreateStatus abstract ChangePassword : string*string*string -> bool end type AccountMembershipService = val provider : MembershipProvider new () = AccountMembershipService(Membership.Provider) new (provider) = {provider = provider} interface IMembershipService with member x.MinPasswordLength with get() = x.provider.MinRequiredPasswordLength member x.ValidateUser (userName, password) = InputValidation.Validate userName "Username cannot be null or empty." InputValidation.Validate password "Password cannot be null or empty." x.provider.ValidateUser(userName, password) member x.CreateUser (userName, password, email) = InputValidation.Validate userName "Username cannot be null or empty." InputValidation.Validate password "Password cannot be null or empty." InputValidation.Validate email "Email cannot be null or empty." let (_, status) = x.provider.CreateUser(userName, password, email, null, null, true, null) status member x.ChangePassword(userName, oldPassword, newPassword) = InputValidation.Validate userName "Username cannot be null or empty." InputValidation.Validate oldPassword "OldPassword cannot be null or empty." InputValidation.Validate newPassword "NewPassword cannot be null or empty." try let currentUser = x.provider.GetUser(userName, true) currentUser.ChangePassword(oldPassword, newPassword) with | :? ArgumentException -> false | :? MembershipPasswordException -> false type IFormsAuthenticationService = abstract SignIn : string*bool -> unit abstract SignOut : unit -> unit type FormsAuthenticationService() = interface IFormsAuthenticationService with member x.SignIn(userName, createPersistentCookie) = InputValidation.Validate userName "Username cannot be null or empty" do FormsAuthentication.SetAuthCookie(userName, createPersistentCookie) member x.SignOut () = do FormsAuthentication.SignOut()You can download the template installer by clicking here. The full solution can be found at http://github.com/dmohl/FSharpMVC2Starter. (Note: The full solution includes a few things that are not included in the template such as a sample test project for the home controller.)
New York Jets jersey
ReplyDeleteSuper bowl jerseys
New York Jets jersey
ReplyDeleteSuper bowl jerseys
I really appreciate this. I've been trying to find a way to start out with MVC and F# and your template makes things much clearer.
ReplyDelete