Выполнение HttpPost для сохранения выбранных значений CheckBox в базе данных - PullRequest
1 голос
/ 24 декабря 2011

Я отправил этот вопрос , чтобы узнать, как разместить checkbox выбранные значения в базе данных.

Однако я не могу получить значения selected на debug из-за NullReferenceException (см. Снимки ниже).

Вот мой код:

Model:

 public class ProductModel
 {
    public string ProductId { get; set; }
    public string ProductName { get; set; }
    public bool Selected { get; set; }
    public string[] CheckedColumn { get; set; }
 }

View:

     @model IEnumerable<DemoApp.Models.ViewModels.ProductModel>

    @{
               ViewBag.Title = "CheckView";
     }

   <table> 
     <tr>
        <th>
          ProductId
        </th>
     <th>
        ProductName
     </th>
     <th>
        Selected
    </th>
        <th></th>
    </tr>

  @foreach (var item in Model) 
 {
   <tr>
      <td>
      @Html.DisplayFor(modelItem => item.ProductId)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.ProductName)
    </td>
    <td>
        @Html.CheckBoxFor(modelItem => item.Selected)
     </td>
   </tr> 
  }

  </table>
   @using (Html.BeginForm())  
   {
  <div>
  <input type="submit" name="AddResult" value="CheckView"/>
  </div>
    }

Controller:

    [HttpGet]
    public ActionResult CheckView()
    {
        DatabaseEntities db = new DatabaseEntities();

        var prodList = from b in db.SysUser3
                       select new ProductModel
                       {
                           ProductId = b.ProductId,
                           ProductName = b.ProductName,
                           Selected = b.SelectedProducts
                       };
        var p = prodList.ToList();
        return View(p);

    }

    [HttpPost]
    public ActionResult CheckView(FormCollection collection)
    {
        try
        {
            ProductModel model = new ProductModel();
            // Get all the selected checkboxlist, do db insertion
            model.CheckedColumn = collection["CheckView"].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }

    }

Вот некоторые снимки, которые я сделал при запуске проекта

After selecting the values from below figure

enter image description here

enter image description here

Что-то не так в моем представлении или контроллере? Может кто-нибудь, пожалуйста, помогите мне?

Ответы [ 3 ]

6 голосов
/ 24 декабря 2011

Ваша модель пуста, потому что вы ничего не передаете от Controller ACtion. Ваш CheckView ActionMethod должен быть действием, которое генерирует представление. Тогда ваша кнопка «CheckView» должна вызвать другое действие HttpPost, которое будет выглядеть как ваш предыдущий CheckView. Дайте мне знать, если это поможет в комментариях.

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

    public ActionResult CheckView(ProductModel model)
    {
       return View("CheckView", model);
    }

Действие для нажатия кнопки.

[HttpPost]
    public ActionResult TestView(FormCollection collection)
    {
        try
        {
            ProductModel model = new ProductModel();
            // Get all the selected checkboxlist, do db insertion
            model.CheckedColumn = collection["CheckView"].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }

    }

И в View что-то вроде этого:

@using (@Html.BeginForm("TestView", "Controller Name"))
{
//all your input here

// submit button here
}
1 голос
/ 10 января 2012

Это известная ошибка. Присоедините функцию javascript к вашей кнопке отправки, которая будет перебирать массив опций флажков и используйте .selected = true; на тех, которые проверены. Только тогда они будут отправлены по почте.

1 голос
/ 04 января 2012

Я согласен с Бобеком.Проблема в том, что вы не реинициализируете модель в действии post.Примерно так:

[HttpGet]
    public ActionResult CheckView()
    {
        DatabaseEntities db = new DatabaseEntities();

        var prodList = from b in db.SysUser3
                       select new ProductModel
                       {
                           ProductId = b.ProductId,
                           ProductName = b.ProductName,
                           Selected = b.SelectedProducts
                       };
        var p = prodList.ToList();
        return View(p);

    }

    [HttpPost]
    public ActionResult CheckView(FormCollection collection)
    {
        try
        {
            ProductModel model = new ProductModel();
            // Get all the selected checkboxlist, do db insertion
            model.CheckedColumn = collection["CheckView"].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            return RedirectToAction("Index");
        }
        catch
        {
            ModelState.addModelError("", "There was an issue processing the results.");
            DatabaseEntities db = new DatabaseEntities();

            var prodList = from b in db.SysUser3
                       select new ProductModel
                       {
                           ProductId = b.ProductId,
                           ProductName = b.ProductName,
                           Selected = b.SelectedProducts
                       };
            return View(prodList.ToList());
        }

    }

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

...