Need to know how to pass a model for paypal transaction - asp.net-mvc-3

I have a simple order form that I created in mvc and when they hit the submit button, I have the user redirected to paypal for payment and then they get redirected back to the original page. I'm trying to find out how to either pass the model information or save it somehow because after payment is complete, my program sends them an email with a copy of their receipt and successful purchase. How do I go about doing this? Please let me know if there is anything else you need to see. I'm still brand new to MVC and I'm trying to figure this all out.
Model
public class WritingAppModel
{
[Required(ErrorMessage = "Name is required")]
public string Name { get; set; }
[EmailAddress(ErrorMessage = "A Valid Email Address is Required.")]
[Required(ErrorMessage = "Email Address is Required.")]
public string Email { get; set; }
[Phone(ErrorMessage = "A Valid Phone Number is Required.")]
[Required(ErrorMessage = "Phone Number is Required.")]
public string PhoneNumber { get; set; }
[Required(ErrorMessage = "Subject is Required.")]
public string Subject { get; set; }
[Required(ErrorMessage = "Topic is Required.")]
public string Topic { get; set; }
[Required(ErrorMessage = "Document Type is Required.")]
public string DocumentType { get; set; }
[Required(ErrorMessage = "Urgency is Required.")]
public string Urgency { get; set; }
[Required(ErrorMessage = "Number of Pages is Required.")]
public Int16 NumberOfPages { get; set; }
[Required(ErrorMessage = "Requirements are Required.")]
[DataType(DataType.MultilineText)]
[StringLength(200)]
public string Requirements { get; set; }
[Required(ErrorMessage = "Writing Style is Required.")]
public string Style { get; set; }
[Required(ErrorMessage = "Spacing is Required.")]
public string Spacing { get; set; }
[Required(ErrorMessage = "Academic Level is Required.")]
public string AcademicLevel { get; set; }
[Required(ErrorMessage = "Number of Sources is Required.")]
public Int16 NumberOfSources { get; set; }
[Required(ErrorMessage = "Price is Required.")]
[Range(0.01, 10000.00, ErrorMessage = "Your quote is not complete because you haven't completed all of the steps.")]
[DataType(DataType.Currency)]
[DisplayFormat(DataFormatString = "{0:C}")]
public decimal Price { get; set; }
public string UnFormattedPrice
{
get
{
return this.Price.ToString();
}
}
[Required(ErrorMessage = "Currency is Required.")]
public string Currency { get; set; }
}

Related

ModelState validation not showing which fields are invalid [duplicate]

This question already has an answer here:
ModelState.IsValid is false prior to validation
(1 answer)
Closed 5 years ago.
My ModelState validation is giving me very generic error messages, I would like to know exactly which fields are invalid.
As you can see the first two textboxes "Startup rate < 1 min" and "Startup rate 1-3 min" are both empty, but the modelstate validation messages only say "The value '' is invalid". I would like it to say which fields exactly are invalid.
I placed the following line in my view: <div asp-validation-summary="All"></div>
This is my controller action and my model with required attributes:
[HttpPost]
public async Task<IActionResult> EditSubtitleSetting(EditSubtitleSettingsModel model)
{
try
{
if (ModelState.IsValid)
{
await _subtitleSettingService.UpdateSubtitleSetting(model);
return RedirectToAction("Subtitling");
}
} catch (CustomException e)
{
foreach (var m in e.Messages)
{
ModelState.AddModelError(m.Key, m.Message);
}
}
return View(model);
}
public class EditSubtitleSettingsModel
{
public string Id { get; set; }
public string FromLanguage { get; set; }
public string ToLanguage { get; set; }
[Required(ErrorMessage = "Startup rate less than one minute is required")]
public decimal StartupRateLessThanOneMinute { get; set; }
[Display(Name = "Startup rate between one and three minutes")]
[Required(ErrorMessage = "Startup rate between one and three minutes is required")]
public decimal StartupRateBetweenOneAndThreeMinutes { get; set; }
[Required(ErrorMessage = "Startup rate between three and five minutes is required")]
public decimal StartupRateBetweenThreeAndFiveMinutes { get; set; }
[Required(ErrorMessage = "Price per subtitle is required")]
public decimal PricePerSubtitle { get; set; }
[Required(ErrorMessage = "Default rate for translators is required")]
public decimal DefaultRateTranslators { get; set; }
}
How can I have the validation message tell me which fields are invalid?
Apparantly, required attribute only works on nullable decimals. So I changed my model to only have nullable decimals, and now it properly shows the validation messages. So a very easy fix.
This is what my model now looks like:
public class EditSubtitleSettingsModel
{
public string Id { get; set; }
public string FromLanguage { get; set; }
public string ToLanguage { get; set; }
[Required(ErrorMessage = "Startup rate less than one minute is required")]
public decimal? StartupRateLessThanOneMinute { get; set; }
[Required(ErrorMessage = "Startup rate between one and three minutes is required")]
public decimal? StartupRateBetweenOneAndThreeMinutes { get; set; }
[Required(ErrorMessage = "Startup rate between three and five minutes is required")]
public decimal? StartupRateBetweenThreeAndFiveMinutes { get; set; }
[Required(ErrorMessage = "Price per subtitle is required")]
public decimal? PricePerSubtitle { get; set; }
[Required(ErrorMessage = "Default rate for translators is required")]
public decimal? DefaultRateTranslators { get; set; }
}

CRUD operation for custom table in umbraco without using admin

I have created a user Register form by using custom table (own table) in Umbraco 7.2 MVC.
User registration form created by using petapoco method.
Model code is shown below:
[TableName("UserLogin")]
[PrimaryKey("UserId", autoIncrement = true)]
[ExplicitColumns]
public class User
{
[Column]
public string UserId { get; set;}
[Column]
[Required(ErrorMessage = "Please provide Name", AllowEmptyStrings = false)]
public string Name { get; set; }
[Column]
[Required(ErrorMessage = "Please provide Email",AllowEmptyStrings=false)]
[DataType(DataType.EmailAddress)]
[RegularExpression("^([a-zA-Z0-9_\\-\\.]+)#[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,3})$", ErrorMessage = "Email is not a valid e-mail address.")]
public string Email { get; set; }
[Column]
[Required(ErrorMessage = "Please provide Adress", AllowEmptyStrings = false)]
public string Address { get; set; }
[Column]
[RegularExpression(#"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$", ErrorMessage = "Entered mobile format is not valid.")]
public string Mobile { get; set; }
[Column]
[Required(ErrorMessage = "Please provide Password", AllowEmptyStrings = false)]
[DataType(DataType.Password)]
[StringLength(255, MinimumLength =6, ErrorMessage = "please enter minimum 6 character")]
public string Password { get; set; }
[Required(ErrorMessage = "Please provide Confirm Password", AllowEmptyStrings = false)]
[Compare("Password", ErrorMessage = "Confirm password dose not match.")]
[DataType(DataType.Password)]
[StringLength(255, MinimumLength = 6, ErrorMessage = "please enter minimum 6 character")]
public string UserConfirmPassWord { get; set; }
}
controller(User controller) code is below for insert
public ActionResult AddUser(User _user)
{
//Add new user
if (!ModelState.IsValid)
{
ViewBag.MessageError = "Not Successfully Registration";
return CurrentUmbracoPage();
}
var db = ApplicationContext.Current.DatabaseContext.Database;
_user.Password = Encrypt(_user.Password);//Encrypt the password
db.Insert(_user);
ViewBag.MessageSuccess = "Successfully Registration Done";
return Redirect("/home/login/");
}
Data insert and selectr are working, but I need to edit, update, delete the data by id .
I would need controller and view code for edit, update delete (Umbraco 7.2 using petapoco).

Should I validation in WEB.UI Models folder?

I have done custommembership as this link:
http://www.brianlegg.com/post/2011/05/09/Implementing-your-own-RoleProvider-and-MembershipProvider-in-MVC-3.aspx
My soulution have two project : CameraStore.Domain and CameraStore.WebUI. In CameraStore.Domain porject, i have an entity named User like this:
public int UserID { get; set; }
[Required]
[Display(Name = "User name")]
public string Username { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[Display(Name = "Name")]
public string Name { get; set; }
[Required]
[Display(Name = "City")]
public string City { get; set; }
[Required]
[Display(Name = "Ward")]
public string Ward { get; set; }
[Required]
[Display(Name = "User name")]
public string Address { get; set; }
[Required]
[DataType(DataType.PhoneNumber)]
[Display(Name = "Phone")]
public string Phone { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email address")]
public string Email { get; set; }
public int RoleID { get; set; }
public virtual Role Role { get; set; }
public virtual ICollection<Order> Order { get; set; }
In my Register Controller method i want to insert user into my database. But i have the field ConfirmPassword, how can i valid it if this property never has in User Entity class. I have used a class named AccountUserModels to return 2 List for 2 dropdownlist in my view, can i add the property ConfirmPassword to this class. I dont want to valid by javascript for ConfirmPassword filed in my view.
Hi if i not wrong you want to compare password right?
try this
[Required(ErrorMessage = "New password is required.")]
[DataType(DataType.Password)]
[StringLength(20, MinimumLength = 5)]
[Display(Name = "New password:")]
public string NewPassword { get; set; }
[Required(ErrorMessage = "Confirm password is required.")]
[DataType(DataType.Password)]
[StringLength(20, MinimumLength = 5)]
[Compare("NewPassword")]
[Display(Name = "Confirm password:")]
public string RePassword { get; set; }
Controller
[HttpPost]
public ActionResult Register(RegisterViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
return RedirectToAction("Success");
}

EF4 MVC3 model state validation

Using this model:
public class Cases
{
//case data model for call center
//implement lists for all related child tables too
[Key]
public int CasesID { get; set; }
public string CaseNumber { get; set; }
[Required(ErrorMessage = "Customer is Required")]
public int CustomerID { get; set; }
public virtual Customer Customer { get; set; }
[MaxLength(50)]
public string UserName { get; set; } //get user name from the aspnet membership
[Required(ErrorMessage = "Case Category is Required")]
public int CaseCategoryID { get; set; }
[Required(ErrorMessage = "Technician is Required")]
public int TechnicianID { get; set; }
public virtual Technician Technicians { get; set; }
[Required(ErrorMessage = "Engine Model is Required")]
public int EngineModelID { get; set; }
public virtual EngineModel EngineModel { get; set; }
[MaxLength(50)]
public string BMSWorkorder { get; set; }
[MaxLength(50)]
[Required(ErrorMessage = "Status is Required")]
public string CaseStatus { get; set; }
[MaxLength(50)]
public string OpenedBy { get; set; }
[Required(ErrorMessage = "Opened Date is Required")]
[DataType(DataType.DateTime)]
public DateTime? OpenedDate { get; set; }
[MaxLength(50)]
public string ClosedBy { get; set; }
[DataType(DataType.DateTime)]
public DateTime? ClosedDate { get; set; }
[MaxLength(50)]
[Required(ErrorMessage="Caller First Name is Required")]
public string CallerFirstName { get; set; }
[MaxLength(50)]
[Required(ErrorMessage = "Caller Last Name is Required")]
public string CallerLastName { get; set; }
[MaxLength(100)]
public string AdditionalContact { get; set; }
[MaxLength(10)]
[Required(ErrorMessage = "Qualified is Required")]
public string Qualified { get; set; }
public string Description { get; set; }
[MaxLength(50)]
[Required(ErrorMessage = "ESN is Required")]
public string ESN { get; set; }
[MaxLength(50)]
[Required(ErrorMessage = "Mileage is Required")]
public string Mileage { get; set; }
[DataType(DataType.Date)]
public DateTime? DateInService { get; set; }
[MaxLength(50)]
public string ESTR { get; set; }
[MaxLength(50)]
[Required(ErrorMessage = "EDS is Required")]
public string EDS { get; set; }
[MaxLength(50)]
public string GensetSerialNumber { get; set; }
[MaxLength(50)]
public string GensetModelNumber { get; set; }
//child Case Notes records
public virtual ICollection<CaseNotes> CaseNotes { get; set; }
//child case attachment records
public virtual ICollection<Attachment> Attachments { get; set; }
//child case complaint records
public virtual ICollection<CaseComplaint> CaseComplaint { get; set; }
//tracking fields
public DateTime? CreatedOn { get; set; }
[MaxLength(50)]
public string CreatedBy { get; set; }
public DateTime? ModifiedOn { get; set; }
[MaxLength(50)]
public string ModifiedBy { get; set; }
}
I am wondering why even though only some of the properties are marked required, the modelstate does not get set valid unless all properties have values when saving.
Am I doing something wrong?
EDIT
Here are my razor elements for the dropdownlist fields in question:
#Html.DropDownList("Qualified", String.Empty)
#Html.ValidationMessageFor(model => model.Qualified)
#Html.DropDownList("EngineModelID", String.Empty)
#Html.ValidationMessageFor(model => model.EngineModelID)
#Html.DropDownList("CaseCategoryID", String.Empty)
#Html.ValidationMessageFor(model => model.CaseCategoryID)
The EngineModelID and CaseCategoryID properties must be nullable integers on your view model if you want to allow empty values. Oooops, you are not using view models.
ASP.NET MVC automatically makes non-nullable types required. You could disable this explicitly in your Application_Start:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
But if you want to do the things properly you should use view models.
The following is absolutely horrible:
#Html.DropDownList("CaseCategoryID", String.Empty)
I guess you have stuffed a SelectList in a ViewBag.CaseCategoryID so the CaseCategoryID does 2 things at the same time: it represents a list and a selected scalar value.
With view models you would use the strongly typed version of those helpers:
#Html.DropDownListFor(x => x.CaseCategoryID, Model.CaseCategories)
where CaseCategories will be an IEnumerable<SelectListItem> property on your view model that the controller would populate.

ASP.NET MVC3 Eager Client-Validation, FluentHTML and Nested ViewModels

I'm using FluentHTML (from MvcContrib) to layout my HTML mark-up. I want to use eager unobtrusive client-validation provided by jquery.validate library. I got everything working correctly except for properties of nested ViewModels. Example:
public class RegisterPageViewModel
{
[Required(ErrorMessage = "First Name cannot be empty.")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Last Name cannot be empty.")]
public string LastName { get; set; }
[Required(ErrorMessage = "Email cannot be empty.")]
[RegularExpression(#"^\w+([-+.']\w+)*#\w+([-.]\w+)*\.\w+([-.]\w+)*$", ErrorMessage = "Invalid Email Format.")]
public string Email { get; set; }
[Required(ErrorMessage = "Password field cannot be empty.")]
[DataType(DataType.Password)]
public string Password { get; set; }
[Required(ErrorMessage = "You have to confirm your password.")]
[Compare("Password", ErrorMessage = "Passwords must match.")]
[DataType(DataType.Password)]
public string PasswordConfirm { get; set; }
[Required]
public AddressDto Address { get; set; }
public bool TermsOfUse { get; set; }
[Required(ErrorMessage = "Nickname is required")]
public string Nickname { get; set; }
public string MiddleName { get; set; }
[Required(ErrorMessage = "Birthdate is required")]
public string Birthdate { get; set; }
public string Phone { get; set; }
[Required(ErrorMessage = "Mobile number is required")]
public string Mobile { get; set; }
public string RakimMelieh { get; set; }
public string ReferralNickname { get; set; }
}
It works perfectly for ALL of the properties except for those inside the Address property, although I decorated the properties of the AddressDto with validation attributes as well:
public class AddressDto
{
public int Id { get; set; }
[Required(ErrorMessage = "Address Name is required.")]
public string Name { get; set; }
public string Country { get; set; }
public string District { get; set; }
public string City { get; set; }
public string Area { get; set; }
[Required(ErrorMessage = "Address Details are required.")]
public string Details { get; set; }
public bool IsDefault { get; set; }
}
The same thing happens for other view models as well where there are nested view models inside them. One thing I noticed when inspecting the input fields FireBug is that they always have the valid class on them, even when they're not really valid (according to the annotations decorating their properties).
Any thoughts how I can solve this problem?

Resources