MVC4 - Convert Blank Date TextBoxFor Field

Is there a way to format null dates (01-01-1900) in MVC4

Currently, I have:
 
@if (Model.DOB == Convert.ToDateTime("01-01-1900"))
            {
                @Html.TextBoxFor(model => model.DOB, new { @Value = "", @class = "textbox150" })
            }
            else
            {
            @Html.TextBoxFor(model => model.DOB, new { @Value = Model.DOB.ToShortDateString(), @class = "textbox150" })
            }

Open in new window


But to do that for all date fields makes a lot of work.
Is there a way around this.

If so, can someone please provide a detailed example.

thanks.
elmbrookAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Bob LearnedCommented:
You could use Nullable<DateTime> (or DateTime?), and then get the value this way:

var displayDate = model.BirthDate.HasValue ? model.BirthDate.Value.ToString("yyyy-MM-dd") : "";
0
elmbrookAuthor Commented:
How would that work?

I get an error message when I put in
 @Html.TextBoxFor(model => model.DOB.HasValue ? model.DOB.ToString("yyyy-MM-dd") : "", new {  @class = "textbox150" })

'System.DateTime' does not contain a definition for 'HasValue' and no extension method 'HasValue' accepting a first argument of type 'System.DateTime' could be found (are you missing a using directive or an assembly reference?)
0
Bob LearnedCommented:
How is DOB defined in the model?  

You should be able to add a ? to the DateTime declaration:

Example:

public DateTime? DOB { get; set; }

Open in new window


When working with nullable value types (like int or DateTime), it can introduce other issues, but you should be able to check if the property has a value (model.DOB.HasValue).
0
Exploring SQL Server 2016: Fundamentals

Learn the fundamentals of Microsoft SQL Server, a relational database management system that stores and retrieves data when requested by other software applications.

elmbrookAuthor Commented:
I have put the code in the View, not the controller.

This is how DOB is defined.

  [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
        [DataMemberAttribute()]
        public global::System.DateTime DOB
        {
            get
            {
                return _DOB;
            }
            set
            {
                OnDOBChanging(value);
                ReportPropertyChanging("DOB");
                _DOB = StructuralObject.SetValidValue(value);
                ReportPropertyChanged("DOB");
                OnDOBChanged();
            }
        }

Open in new window

0
Bob LearnedCommented:
You need to change it to a nullable type:

public global::System.DateTime

         becomes

public global::System.DateTime?
0
elmbrookAuthor Commented:
It won't allow me to do that.

I am in my model designer and when I add a question mark after it, it gives me errors (see screen shot attached).
24-10-2014-9-39-48-a-m-.jpg
0
Bob LearnedCommented:
If you are using the Entity Framework designer, then I would have thought that it generated the property type as DateTime?.  If it is not Entity Framework, then what do you use to design the data model?
0
elmbrookAuthor Commented:
I am using entity framework. My database table fields are all set to not null.
There are no null dates in the database, all I am trying to handle is 01-01-1900 (blank dates).
That was the only way that I could think off on handling blank dates but that means for every date I have to write that code.
I was hoping to find a better solution of handling blank dates.
0
Bob LearnedCommented:
1) If you have to use 01-01-1900, then I would suggest changing the database fields to allow null, and use Nullable<DateTime> (DateTime?).

2) If you work in a restrictive environment, where database changes require an act of God, then translation is easy.  I would always suggest using nullable dates, but that is not set in concrete.

@Html.TextBoxFor(model => Utility.FormatDate(model.DOB, "MM/dd/yyyy")), new { @Value = "", @class = "textbox150" })

internal class Utility 
{
    public static string FormatDate(DateTime dateValue, string mask)
    {
            if (dateValue.ToString("yyyy-MM-dd") == "1900-01-01")
                return "";

            return dateValue.ToString(mask);
    }
}

Open in new window


3) Another approach is to use a View Model, and an entity mapper, like AutoMapper, where you can format the dates in all the view models, and then you wouldn't have to do any logic in the view.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
elmbrookAuthor Commented:
Bob - The solutions provided are just that, solutions.
I think my original solution is the way to go, it just means I have to process each date manually.

thank you for your time and input.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C#

From novice to tech pro — start learning today.