2015-12-31 3 views
1

Я новичок в ASP.net MVC и Razor.Как получить доступ к выбранному значению в списке asp.net mvc?

Я хочу сохранить дату рождения пользователя, используя раскрывающийся список, но я не знаю, как получить доступ к выбранному значению в контроллере. Я использовал TextBoxFor, прежде чем это не подходит для получения даты от пользователя. Я прочитал много подобных вопросов, но я не понял.

часть моего Register.cshtml:

<div class="form-group"> 
     <label class="label">BirthDate</label> 
     <div class="col-md-10"> 
      @Html.TextBoxFor(model => model.UserBirthDate) 
      @Html.ValidationMessageFor(model => model.UserBirthDate)    
      <select name="Year"> 
       <option value="2000">2000</option> 
       <option value="2001">2001</option> 
       <option value="2002">2002</option> 
       <option value="2003">2003</option> 
       <option value="2004">2004</option> 
       <option value="2005">2005</option> 
       <option value="2006">2006</option> 
      </select> 
      <select name="Month"> 
       <option value="7">July</option> 
       <option value="9">September</option> 
       <option value="12">December</option> 
      </select> 
      <select name="Day"> 
       <option value="1">1</option> 
       <option value="2">2</option> 
       <option value="3">3</option> 
       <option value="4">4</option> 
      </select> 
     </div> 
    </div> 

часть моего контроллера:

[HttpPost] 
    public ActionResult Register(User user) 
    { 

     UserRepositories bluser = new UserRepositories(); 

     if (ModelState.IsValid) 
     { 
      if(user.UserBirthDate != null) 
      { 
       ///// 
      } 

      if (bluser.Add(user)) 
      { 

       return MessageBox.Show("Succsess", MessageType.Success); 
      } 
      else 
      { 

       return MessageBox.Show(" UNSuccsess", MessageType.Error); 
      } 
     } 
     else 
     { 


      return MessageBox.Show(ModelState.GetErrors(), MessageType.Warning); 
     } 

    } 

пользователя модель:

public partial class User 
{ 
    public int UserID { get; set; } 
    public string UserEmail { get; set; } 
    public string UserFirstName { get; set; } 
    public string UserLastName { get; set; } 
    public string UserPassWord { get; set; } 
    public string UserCellPhone { get; set; } 
    public string UserTell { get; set; } 
    public string UserImage { get; set; } 
    public string UserAddress { get; set; } 
    public Nullable<byte> UserStatus { get; set; } 
    public Nullable<System.DateTime> UserBirthDate { get; set; } 
    public string UserGender { get; set; } 
} 

usermetaData.cs

internal class UserMetaData 
{ 
    [ScaffoldColumn(false)] 
    [Bindable(false)] 
    public int UserID { get; set; } 

    public string UserEmail { get; set; } 


    public string UserFirstName { get; set; } 


    public string UserLastName { get; set; } 


    [DataType(DataType.Password)] 
    public string UserPassWord { get; set; } 

    public string UserCellPhone { get; set; } 


    public string UserTell { get; set; } 

    public string UserImage { get; set; } 
    public string UserAddress { get; set; } 


    public Nullable<byte> UserStatus { get; set; } 

    public Nullable<System.DateTime> UserBirthDate { get; set; } 


    public string UserGender { get; set; } 
} 
} 
namespace NP1.Models 
{ 
[MetadataType(typeof(NP1.Models.MetaData.UserMetaData))] 
public partial class User 
{ 

    public string UserConfirmPassWord { get; set; } 

    public string Year { get; set; } 
    public string Month { get; set; } 
    public string Day { get; set; } 
} 
+0

Текстовое поле обязательно * может * быть соответствующим, если оно используется для ввода значения даты.Между HTML5 и легкодоступными плагинами JavaScript (например, jQuery UI Datepicker), это довольно тривиально. Что касается получения этих данных в вашем контроллере, все зависит от того, как выглядит ваша модель 'User'. Согласно вашему мнению, вы ожидаете, что у него будет три свойства с именем «Год», «Месяц» и «День». Имеет ли это? Вот где эти три значения будут найдены, когда вы публикуете эту форму. – David

+0

Я обновил свой пост @ Давид, я использовал год, месяц, день. действительно я знаю, как использовать dateTimePicker, но мне это не нравится. Я думаю, что выпадающее меню лучше –

+0

В этом случае значения будут в этих свойствах вашей модели. Логика привязки модели структуры ASP.NET MVC соответствует размещенным именам полей с именами свойств модели. – David

ответ

1

Вы можете изменить свой ViewModel таким образом:

public class UserVM 
{ 
    public string Year { set; get; } 
    public string Month { set; get; } 
    public string Day{ set; get; } 
    // other properties 
} 

Затем в вашем методе действий вы можете заполнить эти свойства следующим образом:

[HttpGet] 
public ActionResult Register(User user) 
{ 
    // It should be better to read this data from database 
    ViewBag.Year = new SelectList(
            new List<SelectListItem> 
            { 
             new SelectListItem { Text = "1368", Value = "1987" }, 
             new SelectListItem { Text = "1369", Value = "1988"}, //.... 
            }, "Value" , "Text"); 
    // Also other properties like Month and Day 
    return View(); 
} 

Тогда внутри вашей точки зрения:

@model ProjectName.VM 
@using (Html.BeginForm()) 
{ 
    <div class="form-group"> 
     @Html.DropDownListFor(m => m.Year, (SelectList)ViewBag.Year, "Select one") 
    </div> 

    <button type="Submit" class="btn btn-success submit">Send</button> 
} 

Наконец ваш метод действия для размещения данных:

[HttpPost] 
    public ActionResult Register(VM model) 
    { 
     if(!ModelState.IsValid) {} 
     var Year = model.Year; 
     // Here you can get other data like Day, Month 
     // rest of your code for saving the data 

     return View(); 
    } 

dotnetfiddle.

2

Как предложил Дэвид в комментариях, вам следует использовать библиотеку выбора даты java-скрипта (Ex: JQuery UI, Bootstrap и т. Д.), Чтобы установить дату в пользовательском интерфейсе, с которым знакомы большинство пользователей. Выпадающие даты для дат кажутся немного старыми! :(

Если вы все еще хотите использовать выпадающие в качестве у вас есть в вашем вопросе, вы должны создать модель представления для вашего зрения и добавить 3 свойства для всех выбранных значений опций.

public class CreateUserVm 
{ 
    public int Year { set; get; } 
    public int Month { set; get; } 
    public int Day{ set; get; } 
    public string UserEmail { set; get; } 
    pubic string UserFirstName {set;get;} 
    //Add other properties as needed 
} 

И в прибудете действие, вы будете отправлять объект этого на ваш взгляд,

public IActionResult Index() 
{ 
    return View(new CreateUserVm()); 
} 

И ваш взгляд, который сильно типизированных с этой точки зрения модели

@model YourNameSpaceHere.CreateUserVm 
<form asp-action="Index" asp-controller="Home" enctype="multipart/form-data"> 
     <label class="label">BirthDate</label> 
     <div class="col-md-10"> 
      @Html.TextBoxFor(model => model.UserEmail) 
      @Html.TextBoxFor(s=>s.UserFirstName)     
      <select name="Year"> 
       <option value="2000">2000</option> 
       <option value="2001">2001</option>     
      </select> 
      <select name="Month"> 
       <option value="7">July</option> 
       <option value="12">December</option> 
      </select> 
      <select name="Day"> 
       <option value="1">1</option> 
       <option value="2">2</option>     
      </select> 
     </div> 
    <input type="submit" /> 
</form> 

Пока значение свойства имени вашего элемента выбора совпадает с именами свойств, которые мы имеем в нашей модели просмотра, привязка модели MVC будет отображать данные формы в объект нашей модели представления при отправке формы.

[HttpPost] 
public IActionResult Index(CreateUserVm model) 
{ 
    if (ModelState.IsValid) 
    { 
     var bluser = new UserRepositories(); 
     //read the model.Year and model.UserName etc and create a user entity here 
     //to do :Save and return something 
     User u = new User { UserEmail= model.UserEmail}; 
     u.UserFirstName = model.UserFirstName ; 
     // Set other properties also.  
     bluser.Add(u); 
    } 
    return View(logos); 
} 

И если вы хотите, чтобы установить выбранный вариант для выпадающего списка в методе редактирования действий, посмотрите на this answer.

+0

Спасибо, я думаю, что не понял по-настоящему, я пишу' DateTime TempDt = Convert.ToDateTime (user.Year + "-" + user.Month + " - «+ user.Day); user.UserBirthDate = TempDt;' но он сохраняет значение Null. Думаю, я должен написать несколько дополнительных кодов, но я не знаю, что: /. –

+0

это должна быть модель. user.Year – Shyju

+0

oops: /, Спасибо. –

Смежные вопросы