2014-12-17 4 views
0

У меня проблема в ASP.NET. Я сделал список флажков, и я хочу отправить выбранные значения обратно на контроллер. Проблема в том, что модель, которую я получаю в моем контроллере, равна нулю.Просмотр передает пустую модель обратно контроллеру

Мой контроллер:

[HttpPost] 
// POST: /Checklist/index 
public ActionResult Index(Zoeken systemencheckboxenss) 
{ 
    var zoekresultaat = _db.VW_Checks.AsQueryable(); 

    if (systemencheckboxenss.Systemen != null) 
    { 
     foreach (var item in systemencheckboxenss.Systemen) 
     { 
      if(item.isSelected == true) 
      { 
       zoekresultaat = zoekresultaat.Where(sy => (sy.Systeemnaam.Contains(item.Systeemnaam))); 
      } 
     } 
    } 

    var systemen = _db.SYSTEEMs; 
    //Lijst van systemen en of het geslecteerd is 
    var systeemnamen = new List<CheckboxSysteem>(); 
    //vult de lijst 

    foreach (var i in systemen) 
    { 
     systeemnamen.Add(new CheckboxSysteem 
     { 
      Systeemnaam = i.SYSTEEMNAAM, 
      isSelected = false, 
     }); 
    } 

    var models = new Zoeken 
    { 
     VwChecks = zoekresultaat.ToList(), 
     Systemen = systeemnamen, 
    }; 

    return View(models); 
} 

А вот мой Вид:

@model UsabilityChecklistApp.ViewModels.Zoeken 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Checks</h2> 

@using (Html.BeginForm("Index", "Checklist", Model, FormMethod.Post)) 
{ 
    <table class="table"> 
     @foreach (var item in Model.Systemen) 
     { 
      <tr> 
       <td> 
        @Html.HiddenFor(modelItem => item.Systeemnaam) 
        @Html.HiddenFor(modelItem => item.isSelected) 
        @Html.DisplayFor(modelItem => item.Systeemnaam) 
       </td> 
       <td> 
        @Html.CheckBoxFor(modelItem => item.isSelected) 
       </td> 

      </tr> 
     } 
    </table> 
    <input type="submit" value="Zoek" /> 
} 

И конечно мой ViewModel:

using System.Web; 
using UsabilityChecklistApp.Models; 

namespace UsabilityChecklistApp.ViewModels 
{ 
    public class Zoeken 
    { 
     public List<VW_Checks> VwChecks { get; set; } 
     public List<CheckboxSysteem> Systemen { get; set; } 
    } 

    public class CheckboxSysteem 
    { 
     public string Systeemnaam { get; set; } 
     public bool isSelected { get; set; } 
    } 
} 

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

EDIT: я должен использовать флажки, никаких других вариантов возможных

+0

использовать для цикла вместо foreach в представлении –

ответ

1

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

Все, что вам нужно сделать, это удалить параметр модели из формы, так что модель Связующее может взять на себя все это для вас

@using (Html.BeginForm("Index", "Checklist", FormMethod.Post))} 

Чтобы получить список на карту правильно, вы должны будете изменены ваш cshtml так:

<table class="table"> 
    @for(int i = 0; i < Model.Systemen.Count; i++) 
    { 
     <tr> 
      <td> 
       @Html.HiddenFor(modelItem => modelItem.Systemen[i].Systeemnaam) 
       @Html.DisplayFor(modelItem => modelItem.Systemen[i].Systeemnaam) 
      </td> 
      <td> 
       @Html.CheckBoxFor(modelItem => modelItem.Systemen[i].isSelected) 
      </td> 

     </tr> 
    } 
</table> 

HTML-хелперы использовать выражения для создания правильной разметки, в частности, имена, которые должны иметь индекс для того, чтобы правильно карте. Если вы используете foreach, выражение не содержит индекс, поэтому генерируемое имя неверно и не может быть отображено в списке. Существует superb answer to a similar question, который дает гораздо лучшее описание этого, чем я когда-либо мог.

Я дал все это быстрый тест, и он работает после удаления параметра Model из BeginForm.

+0

Ваше первое предложение сработало, но теперь я получаю пустой список (отладчик говорит Count = 0). Надеюсь, вы сможете уточнить, почему это происходит. – EJN

+0

Я думаю, вам нужно изменить цикл foreach на for и передать индекс методам html helper, чтобы он генерировал правильные имена для сопоставления массива. Я обновил свой ответ. – DoctorMick

+0

И я только что понял, что на самом деле вы не должны указывать свою модель в BeginForm, пусть сплетение модели свяжется с вами. Ответ снова обновляется. :) – DoctorMick

0

У меня был такой же выпуск. Я попробовал radio buttons вместо checkbox. Пройтись ссылки

MVC3 @Html.RadioButtonfor Pass data from view to controller

View to Controller in mvc3

MVC3 @html.radiobuttonfor

How to pass List in Redirecttoaction

Может быть, ваша проблема будет решить.

+0

Мне нужно иметь возможность выбирать несколько значений, поэтому я должен использовать флажки вместо переключателей – EJN

+0

Используйте 'checkboxes', но попробуйте реализовать мои способы. –

0

Я повторно использовал ваш код и внес изменения; он работает отлично.Попробуйте использовать этот код:

Модель:

public class Zoeken 
    { 
     public Zoeken() { Systemen = new List<CheckboxSysteem>(); } 
     public List<VW_Checks> VwChecks { get; set; } 
     public List<CheckboxSysteem> Systemen { get; set; } 
    } 

    public class CheckboxSysteem 
    { 
     public string Systeemnaam { get; set; } 
     public bool isSelected { get; set; } 
    } 

Контроллер:

// GET: 
    public ActionResult Index() 
    { 
     var model = new Zoeken(); 
     CheckboxSysteem obj1 = new CheckboxSysteem(); 
     CheckboxSysteem obj2 = new CheckboxSysteem(); 
     CheckboxSysteem obj3 = new CheckboxSysteem(); 

     obj1.Systeemnaam = "Check1"; 
     obj1.isSelected = true; 
     obj2.Systeemnaam = "Check3"; 
     obj2.isSelected = false; 
     obj3.Systeemnaam = "Check3"; 
     obj3.isSelected = true; 

     model.Systemen.Add(obj1); 
     model.Systemen.Add(obj2); 
     model.Systemen.Add(obj3); 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(Zoeken model) 
    {   
     return View(model); 
    } 

Вид:

@model MvcApplication2.Models.Zoeken 
@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>Index</title> 
</head> 
<body> 
    <div> 
     @using (Html.BeginForm()) 
     { 
      <table class="table"> 
       @for (int i = 0; i< Model.Systemen.Count; i++) 
       { 
        <tr> 
         <td> 
          @Html.HiddenFor(m => m.Systemen[i].Systeemnaam) 
          @Html.HiddenFor(m => m.Systemen[i].isSelected) 
          @Html.DisplayFor(m => m.Systemen[i].Systeemnaam) 
         </td> 
         <td> 
          @Html.CheckBoxFor(m => m.Systemen[i].isSelected) 
         </td> 

        </tr> 
       } 
      </table> 
      <input type="submit" value="Zoek" /> 
     } 

    </div> 
</body> 
</html> 

комментарий, если он все еще не работает.

+0

Больше не нужно, это работает – EJN

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