2012-01-28 1 views
-1

Я дата рождения и возраст поля по моему СОЗДАТЬ ФОРМУ и я хочу, чтобы автоматически вычислять и отображать возраст, как только дата рождения заполняется.Автоматическое отображение возраста в моем «СОЗДАТЬ ФОРМУ»

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

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

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 Строительных лесов. Тогда в частичном представлении Create нет текстового поля для возраста. Поэтому, пожалуйста, предоставьте код.

+0

Как вы можете ожидать, что пользователь может ввести свой возраст в * читать только свойство *? Вероятно, вы найдете его в представлении «Просмотр», а не в «Создать» или «Редактировать». Кроме того, каковы атрибуты '[Integer]' и '[Min]', и какова точка проверки на свойство только для чтения? – Kobi

ответ

0

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

Возможно, вы захотите проверить свои данные, реализовав интерфейс 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.

+0

это мой первый ответ MVC - я надеюсь, что все в порядке. – Kobi

-1
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; 
} 
Смежные вопросы