Автоматически отображать возраст в моей "CREATE FORM" - PullRequest
0 голосов
/ 28 января 2012

У меня есть поле даты рождения и возраста в моей CREATE FORM, и я хочу автоматически вычислять и отображать возраст после заполнения даты рождения.

Поэтому я использую CodeFirst от EntityFramework и MVC 3 Razor View

Итак, вот моя модель:

  namespace Payroll_System.Models
    {
  public class Employee
  {
    [DataType(DataType.Date)]
    [DisplayName("Date of Birth:")]
    [Required(ErrorMessage = "Birth Date is Required.")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0;dd/MM/yyyy}"
    , NullDisplayText = "No Date of Birth is Selected.")]
    public DateTime BirthDate { get; set; }


    [Integer]
    [Min(1, ErrorMessage = "Unless you are Benjamin Button.")]
    public int Age
    {
        get
        {
            DateTime now = DateTime.Today;
            int age = now.Year - BirthDate.Year;
            if (BirthDate > now.AddYears(-age)) age--; ;
            return age;
        }

    }

И после того, как я создал модель, я создаю свой контроллер с опциями CRUD, используя MVC Scaffolding. Тогда в частичном представлении Create нет текстового поля для возраста. Поэтому, пожалуйста, укажите код.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2012
get 
{ 
   DateTime now = DateTime.Today; 
   int age = now.Year - BirthDate.Year; 
   if (BirthDate > now.AddYears(-age)) age--; ; 
   return age; 
} 

Это неправильно, если вы также сохраняете время, это должен быть код ниже

get 
{ 
   DateTime now = DateTime.Now; 
   int age = now.Year - BirthDate.Year; 
   if (BirthDate > now.AddYears(-age)) age--; ; 
   return age; 
} 
0 голосов
/ 28 января 2012

Вы не можете вводить значения, не говоря уже о проверке, свойство только для чтения .

Возможно, вы захотите проверить свои данные с помощью интерфейса IValidatableObject.

Модель:

public class PersonFromSO : IValidatableObject
{
    [DataType(DataType.Date)]
    [DisplayName("Date of Birth:")]
    [Required(ErrorMessage = "Birth Date is Required.")]
    [DisplayFormat(ApplyFormatInEditMode = true,
                   DataFormatString = "{0;dd/MM/yyyy}",
                   NullDisplayText = "No Date of Birth is Selected.")]
    public DateTime BirthDate { get; set; }

    public int Age
    {
        get
        {
            DateTime now = DateTime.Today;
            int age = now.Year - BirthDate.Year;
            if (BirthDate > now.AddYears(-age)) age--; ;
            return age;
        }

    }

    public IEnumerable<ValidationResult> Validate(ValidationContext context)
    {
        if (Age < 1)
            yield return new ValidationResult("You were born in the future.",
                                              new[] { "Age" });
    }
}

Вид:

@model PersonFromSO

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm())
{

    @Html.ValidationSummary()

    @Html.LabelFor(m => m.BirthDate)
    @Html.TextBoxFor(m => m.BirthDate)

    <time>@Model.Age</time> 

    <input type="submit" />
}

Вот также контроллер, который я использовал, если нужно:

public class PersonFromSOController : Controller
{
    public ActionResult Create()
    {
        return View(new PersonFromSO());
    }

    [HttpPost]
    public ActionResult Create(PersonFromSO person)
    {
        return View(person);
    }
}

Я бы отметил, что это немного запутанно, и вам, вероятно, лучше проверить BirthDate напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...