|
The problem you have is that you're dividing two integers, so the result will be truncated to an integer before the result is stored in your variable.
Only one of the casts is unnecessary; if either the numerator or denominator is a floating-point type, the other will be converted to that type before the division takes place.
You can simplify your code by using a numeric suffix:
However, if you want an integer number to be treated as double, use the suffix d or D, for example:
double x = 3D;
So in your example:
double number = 6D / 10D;
There are other suffixes you can use to denote other numeric types:
C# - Numeric Suffixes - Stack Overflow[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hi all friends,
I have a Model which is needed to have different validation attributes assigned to it in different Conditions, I don't have to create multiple classes for different attributes, because the same model class is being used in multiple post methods.
Following is my class:
public class ServiceFunctionCategoryLKP
{
public int Id { get; set; }
[Required(ErrorMessage = "Code is required.")]
[StringLength(2, MinimumLength = 2, ErrorMessage = "The field {0} length must be at least 2.")]
public string Code { get; set; }
[Required(ErrorMessage = "Description is required.")]
public string Description { get; set; }
public string ServiceFunctionCategoryCode { get; set; }
[Required(ErrorMessage = "ModeOfServiceCode is required.")]
public string ModeOfServiceCode { get; set; }
public string ModeOfServiceDescription { get; set; }
public int CodeLenth {get; set;}
}
StringLength attribute should be different for different calls, is there any way I can have set it differently or dynamically depending upon the input object of the action method. Means I have a field in my input object as above called CodeLength, depending upon this field I have to change the StringLength attributes MinimumLength and Error message properties dynamically, it means in every different Post call, it could be different depending upon the CodeLength field value.
If I have tried in the following way, with IsValid method, problem is how would I know CodeLength field (that is coming as a property of Object in action method) within IsValid method to compare the length of the field with CodeLength field.
public override bool IsValid(object value)
{
int num = (value == null) ? 0 : ((string)value).Length;
return value == null || (num >= this.MinimumLength && num <= this.MaximumLength);
}
Any help would be greatly greatly helpful, thanks in advance friends.
Thanks,
Abdul Aleem
"There is already enough hatred in the world lets spread love, compassion and affection."
-- modified 3-Aug-18 14:31pm.
|
|
|
|
|
"Baked in" at compile time, apparently.
Might try overriding the properties in question with a derived class for each of the "different conditions".
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
can you please give me some example or something please?
Thanks,
Abdul Aleem
"There is already enough hatred in the world lets spread love, compassion and affection."
|
|
|
|
|
Not easily, but it can be done.
You're going to need to create a custom DataAnnotationsModelValidatorProvider , and modify the rules it returns.
validation - Possible to change Data Annotations during Runtime? (ASP.NET MVC's [Range] [Required] [StringLength] etc.) - Stack Overflow[^]
Eg:
public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider
{
protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
if (metadata.Model is ServiceFunctionCategoryLKP model && metadata.PropertyName == nameof(model.Code) && model.CodeLength >= 0)
{
var newAttributes = new List<Attribute>(attributes);
var stringLength = newAttributes.OfType<StringLengthAttribute>().FirstOrDefault();
if (stringLength != null)
{
newAttributes.Remove(stringLength);
if (model.CodeLength != 0)
{
newAttributes.Add(new StringLengthAttribute(model.CodeLength)
{
MinimumLength = model.CodeLength,
ErrorMessage = $"The field {{0}} length must be at least {model.CodeLength}."
});
}
attributes = newAttributes;
}
}
return base.GetValidators(metadata, context, attributes);
}
} Register in Globals.asax.cs :
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add( new CustomValidatorProvider() );
NB: You're effectively allowing the user to override the validation rule by modifying a hidden field on the page. As a result, the validation can't really be trusted.
It would be better to create a separate model class for each required code length.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Just checking, is it going to remove all the other Validations that I have put on other classes?
Thanks,
Abdul Aleem
"There is already enough hatred in the world lets spread love, compassion and affection."
|
|
|
|
|
No. It checks that the instance being validated is the specific model class; that the property being validated is the Code property; and it only replaces the StringLength validator on that property.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hi Richard,
One last thing, I have created the method in the following way:
public class CustomModelValidatorProvider : System.Web.Mvc.DataAnnotationsModelValidatorProvider
{
protected override IEnumerable<System.Web.Mvc.ModelValidator> GetValidators(System.Web.Mvc.ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
if (metadata.Model is LookupTable)
{
LookupTable model = metadata.Model as LookupTable;
if (metadata.PropertyName == GetPropertyName(() => model.CodeLength) && (model.CodeLength > 0))
{
var newAttributes = new List<Attribute>(attributes);
var stringLength = newAttributes.OfType<StringLengthAttribute>().FirstOrDefault();
if (stringLength != null)
{
newAttributes.Remove(stringLength);
if (model.CodeLength != 0)
{
newAttributes.Add(new StringLengthAttribute(model.CodeLength)
{
MinimumLength = model.CodeLength,
ErrorMessage = @"The field {{0}} length must be at least {model.CodeLength}."
});
}
attributes = newAttributes;
}
}
}
return base.GetValidators(metadata, context, attributes);
}
public string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
{
var me = propertyLambda.Body as MemberExpression;
if (me == null)
{
throw new ArgumentException("You must pass a lambda of the form: '() => Class.Property' or '() => object.Property'");
}
return me.Member.Name;
}
}
can you please let me know how can I decorate or use it on my Model class, can you please give me that example, I am asking this question because this value is coming as null: metadata.PropertyName, so I am not able to compare with property name. So any help please?
thank you very very much buddy - as I said earlier have a Wonderful weekend with family and friends buddy.
Thanks,
Abdul Aleem
"There is already enough hatred in the world lets spread love, compassion and affection."
-- modified 3-Aug-18 19:53pm.
|
|
|
|
|
You register the provider in Global.asax.cs :
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add( new CustomValidatorProvider() );
I'd expect to see the PropertyName set to null for the class-level validation, but I'd expect the method to be called again for each property on the class.
You're currently checking whether the validators are for the CodeLength property; you need to customise the validators for the Code property instead.
if (metadata.PropertyName == GetPropertyName(() => model.Code) && ...
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add( new CustomValidatorProvider() );
I did this registration in the Global.asax.cs file, in the Application_Start() event.
And even if I changed the Condition to:
if (metadata.PropertyName == GetPropertyName(() => model.Code) && (model.CodeLength > 0))
Still I am getting the metadata.PropertyName null always, can you please suggest me what am I missing?
Just asking am I using any wrong namespace in references?, Because it was saying there is an ambiguous class names and those classes present in both the following namespaces using System.Web.ModelBinding; using System.Web.Mvc;
Am I using any wrong namespace or something like that kind of error, I am not understanding why is it giving metadata.PropertyName as null in all the cases?
Thanks,
Abdul Aleem
"There is already enough hatred in the world lets spread love, compassion and affection."
-- modified 6-Aug-18 13:01pm.
|
|
|
|
|
Sorry, I picked the wrong property to test against. Replace metadata.Model with metadata.Container :
if (metadata.Model is ServiceFunctionCategoryLKP model && metadata.PropertyName == nameof(model.Code) && model.CodeLength >= 0)
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
But still the attributes value in IEnumerable<attribute> attributes coming as null when I already have one Attribute on that class and when I try to expan the attributes collection object, it shows me "Enumeration yielded no results" in the end.
public class LookupTable
{
public int Id { get; set; }
[Required(ErrorMessage = "Code is required.")]<br />
public string Code { get; set; }
[Required(ErrorMessage = "Description is required.")]
public string Description { get; set; }
public int? ForeignKeyId { get; set; }
public string ForeignKeyValue { get; set; }
public DateTime? CreatedDate {get;set;}
public string CreatedBy {get;set;}
public int CodeLength { get; set; }
}
Do I need to add anymore Attributes to the Code Property?, what am I missing here my friend?
Even after I changed my function to have Container instead of Model, still I get null at metadata.PropertyName
Always metadata.PropertyName is coming as null irrespective of any changes I do at if (metadata.PropertyName == GetPropertyName(() => model.Code) && (model.CodeLength > 0))
in the below function and attributes is also coming as null.
protected override IEnumerable<System.Web.Mvc.ModelValidator> GetValidators(System.Web.Mvc.ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
if (metadata.Model is LookupTable)
{
LookupTable model = metadata.Container as LookupTable;
if (metadata.PropertyName == GetPropertyName(() => model.Code) && (model.CodeLength > 0))
{
var newAttributes = new List<Attribute>(attributes);
var stringLength = newAttributes.OfType<StringLengthAttribute>().FirstOrDefault();
if (stringLength != null)
{
newAttributes.Remove(stringLength);
if (model.CodeLength != 0)
{
newAttributes.Add(new StringLengthAttribute(model.CodeLength)
{
MinimumLength = model.CodeLength,
ErrorMessage = @"The field {{0}} length must be at least {model.CodeLength}."
});
}
attributes = newAttributes;
}
}
}
return base.GetValidators(metadata, context, attributes);
}
Thanks,
Abdul Aleem
"There is already enough hatred in the world lets spread love, compassion and affection."
|
|
|
|
|
I don't know what to suggest. I've tested the code, and it works.
If you're not putting a static StringLength attribute on the property, you'll need to the if (model.CodeLength != 0) block outside of the if (stringLength != null) block:
if (stringLength != null)
{
newAttributes.Remove(stringLength);
}
if (model.CodeLength != 0)
{
newAttributes.Add(new StringLengthAttribute(model.CodeLength)
{
MinimumLength = model.CodeLength,
ErrorMessage = @"The field {{0}} length must be at least {model.CodeLength}."
});
}
attributes = newAttributes;
But if you're never seeing a value in metadata.PropertyName , then there's something else going on.
I assume you have actually enabled unobtrusive validation?
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
No I have not done this: unobtrusive validation, can you please let me know how to do it only on one particular class and property that I want.
Thanks,
Abdul Aleem
"There is already enough hatred in the world lets spread love, compassion and affection."
|
|
|
|
|
|
|
Assuming that frmPopup is a dialog, you should only show it when you need to use it to communicate something to the user. Use the Form.ShowDialog() method so it does not stay on screen.
|
|
|
|
|
Set the popup forms TopMost property to true and use the Form.Show method instead of Form.ShowDialog
That way, it'll "float" above Form1, and you will still be able to enter data in the Form1 Textbox.
Sent from my Amstrad PC 1640
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
|
You're welcome!
Sent from my Amstrad PC 1640
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
You can set the 'Owner property of the pop-up Form to be the first Form ... which I assume is the Main Form. That will guarantee that when you show the pop-up, it will remain "above" the Main Form.
To get further assistance, I suggest you describe what your goal is in more detail: what is the relation of data the user enters on the Main Form to the what is displayed on the pop-up Form ?
«... thank the gods that they have made you superior to those events which they have not placed within your own control, rendered you accountable for that only which is within you own control For what, then, have they made you responsible? For that which is alone in your own power—a right use of things as they appear.» Discourses of Epictetus Book I:12
|
|
|
|
|
As a beginner in CSharp, how do i differentiate between a class and a method. Thanks
|
|
|
|
|
A class contains constructors, members, properties, and methods.
For example:
class Complex
{
private double real;
private double imag;
public Complex()
{
real = 0.0;
imag = 0.0;
}
public Complex(double x)
{
real = x;
imag = 0.0;
}
public Complex(double x, double y)
{
real = x;
imag = y;
}
public double Real { get; set; }
public double norm()
{
return real * real + imag * imag;
}
};
Freedom is the freedom to say that two plus two make four. If that is granted, all else follows.
-- 6079 Smith W.
|
|
|
|
|
You might want to start with fundamentals. Firts: Google is your friend, i.e. learn to do some independent research.
There's an in-depth Object Oriented Design primer intended just for folks like you at:
Introduction to Object Oriented Programming Concepts (OOP) and More
"Never attribute to malice that which can be explained by stupidity."
- Hanlon's Razor
|
|
|
|
|
Simple: a class starts with <public|private|protected|internal|protected internal> class followed by the class name.
A method starts with <public|private|protected|internal|protected internal> followed by the return type (or void ) then the method name and a pair of brackets containing any parameters.
Plus, a method can only be defined inside a class, and not the other way round.
Sent from my Amstrad PC 1640
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|