Создание раскрывающегося списка в MVC3 C # с ViewModel и простой привязкой модели на POST. - PullRequest
0 голосов
/ 01 марта 2012

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

Моя ViewModel:

public class WeekDienstCreateViewModel
{
    public WeekDienst weekDienst {get; set;}
    public List<DienstPerWeekDienst> diensten { get; set; }

    public WeekDienstCreateViewModel() { }
}

Мой метод создания в контроллере: Как вы можете видеть, я уже добавляю все, кроме DienstId, который я хочу добавить в мои выпадающие списки.

 public ActionResult Create(int id)
        {
            WeekDienst wd = _service.FindWeekDienst(id);
            WeekDienstCreateViewModel vm = new WeekDienstCreateViewModel();

            vm.diensten = new List<DienstPerWeekDienst>();
            vm.weekDienst = wd;

            for (int i = 1; i <= 7; i++)
            {
                DienstPerWeekDienst dpwd = new DienstPerWeekDienst();
                dpwd.volgnummer = i;
                dpwd.WeekDienstId = wd.Id;

                vm.diensten.Add(dpwd);
            }
            ViewBag.Diensten = _service.DienstenList(wd.AfdelingId);

            return View(vm);
        } 

Классы:

 public class DienstPerWeekDienst
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public int WeekDienstId { get; set; }

        [Required]
        public int DienstId { get; set; }

        [Required]
        [Range(1, 7)]
        public int volgnummer { get; set; }

        [ForeignKey("WeekDienstId")]
        public virtual WeekDienst WeekDienst { get; set; }

        [ForeignKey("DienstId")]
        public virtual Dienst Dienst { get; set; }

        public virtual ICollection<WeekDienst> WeekDiensten { get; set; }
    }

 public class WeekDienst
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public int AfdelingId { get; set; }

        [Required]
        [StringLength(5, ErrorMessage = "Value for {0} cannot exceed {1} characters.")]
        [RegularExpression(@"^[a-zA-Z0-9]{5}$", ErrorMessage = "Verplicht 5 cijfers lang.")]
        public string code { get; set; }

        [DisplayName("Template")]
        public bool template { get; set; }

        [ForeignKey("AfdelingId")]
        public virtual Afdeling Afdeling { get; set; }
    }

И, на мой взгляд, я хочу создать 7 выпадающих меню, в которые я вставил все свои «Diensten» (класс Dienst, fk в DienstPerWeekDienst). Когда я выбираю 1, я хочу добавить «DienstId» в класс «DienstPerWeekDienst».

Итак, на мой взгляд, я получил это:

            @foreach (var day in Model.diensten)                 
             {   
                  var currentDay=day;
                  @Html.DropDownListFor(currentDropDown=>currentDay, new SelectList(ViewBag.Diensten, "Value", "Text"))                 
             }

Я хочу отправить обратно выбранный "Diensten" и создать "WeekDienst", но сейчас я просто публикую нулевой "DienstPerDienstWeekCreateViewModel". Как я могу это исправить?

Заранее спасибо

FIX (Спасибо Шива Гопал)

Я исправил это, выполнив:

@for (int i = 0; i < @Model.diensten.Count; i++)
                {
                    @Html.HiddenFor(m => (m.diensten[i].volgnummer))
                    @Html.HiddenFor(m => (m.diensten[i].WeekDienstId))
                    @Html.DropDownListFor(m=> (m.diensten[i].DienstId), new SelectList(ViewBag.Diensten, "Value", "Text"))
                }

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Вы можете попробовать использовать

@foreach (var day in Model.diensten)                 
 {   
      var currentDay=day;              
      @Html.DropDownListFor(currentDropDown=>currentDay, new SelectList(ViewBag.Diensten, "PropertyName_Holding_Value", "PropertyName_Holding_DisplayText"), new { })                 
 }  //This uses the Lambda Expression. Your dropdown Name/Id would be 1,2,3 etc. based on currentDay value.

OR

@foreach (var day in Model.diensten)                 
 {   
      var currentDay=day;
      var dropdownName=string.Format("diensten[{0}]",day-1); //If you want to model bind the selected dropdown value to input entity in POST request. The final dropdownName format should match the hierarchy of the property inside input entity/object. Even without this name formation, you can still POST the selected value back using Jquery/Javascript.
      @Html.DropDownList(dropdownName, new SelectList(ViewBag.Diensten, "PropertyName_Holding_Value", "PropertyName_Holding_DisplayText"), new {})                 
 }  //

Примечание для Value Post / привязка модели на полной странице: Чтобы можно было смоделировать обратные значения привязки / POST к серверу, имена элементов html, соответствующие свойствам, должны отображаться следующим образом: предположим, если вы отображаете Employee.Department.Name, тогда имя текстового поля, отображающее имя отдела в представлении, соответствует Department_ReferenceName_Inside_Employee.Name для привязки модели.

Модель: сотрудник публичного класса { public int Id {get; задавать; } публичная строка Name {get; задавать; } публичная строка City {get; задавать; } государственный департамент EmpDepartment {get; задавать; } общедоступный список субординатов {get; задавать; } } общественный класс { публичная строка Name {get; задавать; } }

Контроллер:

public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            //Prepare the model and send it to the view
            Employee emp = new Employee { EmpDepartment = new Department { Name = "IT" } };
            emp.SubOrdinates = new List<Employee> { new Employee { Name = "Emp1" }, new Employee { Name = "Emp2" } };
            return View(emp);
        }

        [HttpPost]
        public ActionResult Index(Employee emp)
        { //Put a break-point here and see how the modified values in view are flowing into emp..
            return View(emp); 
        }
        public ActionResult About()
        {
            return View();
        }
    }

Вид:

@model MvcApplication.Models.Employee
@using (Html.BeginForm())
{

    @Html.TextBoxFor(m => m.EmpDepartment.Name)
    @Html.LabelForModel("SubOrdinates :")
    for (int i = 0; i < @Model.SubOrdinates.Count; i++)
    {
          @Html.TextBoxFor(m => (m.SubOrdinates[i].Name))
    }
<input type="submit" name="name" value="Submit" />    }

ViewSource / исходный текст: Приведенный выше синтаксис текстового поля будет представлен как:

<input id="EmpDepartment_Name" name="EmpDepartment.Name" type="text" value="IT" />    <!--See above html : name=EmpDepartment.Name --> 
<label for="">SubOrdinates :</label>  
<input id="SubOrdinates_0__Name" name="SubOrdinates[0].Name" type="text" value="Emp1" />  
<input id="SubOrdinates_1__Name" name="SubOrdinates[1].Name" type="text" value="Emp2" />  <!--See above html for how collection item Name(s) are being renderd by view engine-->     
<input type="submit" name="name" value="Submit" />
0 голосов
/ 26 марта 2016
List<MvcApplication1.Models.Country> cntry = db.Countries.ToList();
SelectListItem sss = new SelectListItem();
List<SelectListItem> sltst = new List<SelectListItem>();
sss.Text = "Select";
sss.Value = "0";
sltst.Add(sss);
foreach (MvcApplication1.Models.Country s in cntry){
SelectListItem s1 = new SelectListItem();
s1.Text = s.Country1;
s1.Value = Convert.ToString(s.Id);
sltst.Add(s1);}
@Html.DropDownList("country", sltst, new { @id = "country" })
0 голосов
/ 01 марта 2012
@foreach (var day in Model.diensten)
{
   var currentDay = day;
   @Html.DropDownListFor(x => currentDay, new SelectList(ViewBag.Diensten, "Value", "Text"), new { @id = "DienstList" })
}
...