2014-12-19 2 views
1

У меня есть gridview в MVC, когда я нажимаю на редактирование, что определенная строка превращается в текстовые поля, но данные не обновляются. данные, которые я изменил, не сохраняются после нажатия на вкладку или ввода предыдущей записи. Что мне нужно изменить для получения моего результата?Данные не сохраняются в базе данных после редактирования - MVC

мой JQuery код:

<script type="text/javascript"> 
     $(document).ready(function() { 
      $('a.edit').click(function() { 
       var dad = $(this).parent().parent(); 
       dad.find('.displaytext').hide(); 
       dad.find('input[type="text"]').show(); 
      }); 

     $('input[type=text]').focusout(function() { 
      var dad = $(this).parent(); 
      $(this).hide(); 
      dad.find('.displaytext').show(); 
     }); 
     }); 
    </script> 

мой код контроллера для редактирования

[HttpGet] 
     public ActionResult Edit(int id = 0) 
     { 
      tbl_HolidayList tbl_holidaylist = db.tbl_HolidayList.Find(id); 
      if (tbl_holidaylist == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(tbl_holidaylist); 
     } 

     // 
     // POST: /Holiday/Edit/5 

     [HttpPost] 
     public ActionResult Edit(tbl_HolidayList tbl_holidaylist) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Entry(tbl_holidaylist).State = EntityState.Modified; 
       db.SaveChanges(); 
       TempData["Msg"] = "Data has been updated succeessfully"; 
       return RedirectToAction("Index"); 
      } 
      return View(tbl_holidaylist); 
     } 

HTML код

<table> 
     <tr> 
@*   <th> 
       @Html.Label("ID") 
      </th>*@ 
      <th> 
       @Html.Label("Name") 
      </th> 
      <th> 
       @Html.Label("Description") 
      </th> 
      <th> 
       @Html.Label("Date") 
      </th> 
      <th></th> 
     </tr> 

    @foreach (var item in Model) { 
     <tr> 
      @* <td> 
       @Html.TextBoxFor(modelItem => item.Holiday_Id, new { style = "display: none; width:170px; height:15px" }) 
       <div class="displaytext"> 
        @Html.DisplayFor(modelItem => item.Holiday_Id) 
       </div> 
      </td>*@ 
      <td> 
       @Html.TextBoxFor(modelItem => item.Holiday_Name, new { style = "display: none; width:170px; height:15px" }) 
       <div class="displaytext"> 
        @Html.DisplayFor(modelItem => item.Holiday_Name) 
       </div> 
      </td> 
      <td> 
       @Html.TextBoxFor(modelItem => item.Holiday_Description, new { style = "display: none; width:170px; height:15px" }) 
       <div class="displaytext"> 
        @Html.DisplayFor(modelItem => item.Holiday_Description) 
       </div> 
      </td> 
      <td> 
       @Html.TextBoxFor(modelItem => item.Holiday_date, new { style = "display: none; width:170px; height:15px" }) 
       <div class="displaytext"> 
        @Html.DisplayFor(modelItem => item.Holiday_date) 
       </div> 
      </td> 
      <td> 
       <a id="edit" class="edit" href="#">Edit</a> | 
       @*@Html.ActionLink("Edit", "Edit", new { id = item.Holiday_Id }, new { @class = "lnkEdit" }) |*@ 
       @* @Html.ActionLink("Details", "Details", new { id = item.Holiday_Id}, new { @class = "lnkDetail" }) |*@ 
       @Html.ActionLink("Delete", "Delete", new { id = item.Holiday_Id }, new { @class = "lnkDelete" }) 
       @*<a id="edit" class="edit" href="#">Edit</a> | 
       @Html.ActionLink("Delete", "Delete", "Holiday")*@ 
      </td> 
     </tr> 
    } 

    </table> 
+0

бы помочь, если вы предоставили HTML-разметку для ячейки – charlietfl

+0

Я добавил HTML-код. –

+0

Все, что вы делаете, это отображение текстовых полей и скрытие, когда оно теряет фокус. вы не обновляете текст в строке таблицы, и у вас нет способа сохранения данных в базе данных (без формы или ajax для публикации данных). Также вы создаете недопустимый html (атрибуты дубликата id). –

ответ

1

Ваш текущий код не передает значения между текстом на дисплее и на входе

Не видя HTML, вы можете попробовать что-то вроде следующее:

$('a.edit').click(function() { 
    var dad = $(this).parent().parent(); 
    var $display = dad.find('.displaytext').hide(); 
    /* get recent text */ 
    var txt = $display.text(); 
    /* use val() to update input */ 
    dad.find('input[type="text"]').val(txt).show(); 
}); 

$('input[type=text]').focusout(function() { 
    var dad = $(this).parent(); 
    $(this).hide(); 
    /* use input value to update text */ 
    var val = this.value; 
    /* do ajax here to update server if needed */ 
    dad.find('.displaytext').text(val).show(); 
}); 
0

Я сделал страницу редактирования рядных сеток конкретного на основе плагин некоторого время назад, Вот как я это worked-

<script type="text/javascript"> 
    function siblingsEditor(ele) { 
     $(ele).parent().parent('tr').siblings().children('td').not(':first-child').not(':last-child').each(function() { 
      var values; 
      if ($(this).children().is('input[type="text"]')) { 
       values = $(this).children('input').val(); 
      } 
      else { 
       values = $(this).children('label').text(); 
      } 
      var nameofthiselement = $(this).attr('data-target'); 
      $(this).html('<label for="' + nameofthiselement + '">' + values + '</label>'); 
     }); 
    } 

    function Edit(element, id) { 
     siblingsEditor(element); 
     $(element).hide(); 
     $(element).next().show(); 
     $(element).next().next().show(); 
     $(element).parent().parent('tr').children('td').not(':first-child').not(':last-child').each(function() { 
      var nameofthiselement = $(this).children().attr('for'); 
      $(this).html('<input type="text" class="form-control" name="' + nameofthiselement + '" value="' + $(this).children('label').html() + '"></input>'); 
     }); 
    } 
    function Cancel(element, id) { 
     $(element).hide(); 
     $(element).prev().show(); 
     $(element).next().hide(); 
     $(element).prev().prev().show(); 
     $(element).parent().parent('tr').children('td').not(':first-child').not(':last-child').each(function() { 
      var values; 
      if ($(this).children().is('input[type="text"]')) { 
       values = $(this).children('input').val(); 
      } 
      else { 
       values = $(this).children('label').text(); 
      } 
      var nameofthiselement = $(this).attr('data-target'); 
      $(this).html('<label for="' + nameofthiselement + '">' + values + '</label>'); 
     }); 
    } 
    function Update(element, id) { 
     $.ajax({ 
      url: '/Controller/Action?ID=' + id, 
      type: 'POST', 
      data: $('#form').serialize(), 
      success: function (data) { 
       $(element).hide(); 
       $(element).prev().hide(); 
       $(element).prev().prev().show(); 
       $(element).parent().parent('tr').children('td').not(':first-child').not(':last-child').each(function() { 
        var values; 
        if ($(this).children().is('input[type="text"]')) { 
         values = $(this).children('input').val(); 
        } 
        else { 
         values = $(this).children('label').text(); 
        } 
        var nameofthiselement = $(this).attr('data-target'); 
        $(this).html('<label for="' + nameofthiselement + '">' + values + '</label>'); 
       }); 
      } 
     }); 
    } 
    function Delete(element, id) { 
     $.post({'/controller/Actiion?ID=' + id,function (data) { 
      $(element).parent().parent().fadeOut(); 
     } 
     }); 
    } 
</script> 

Примечание- Я ограничен таблица, чтобы быть в определенной структуре, где for атрибута должен соответствовать data-target таблице столбцов

<form id="form"> 
    <table class="table"> 
     <tr> 
      <th>S.NO. 
      </th> 
      <th>header1 
      </th> 
      <th>header2 
      </th> 
      <th>Actions</th> 
     </tr> 
     <tbody> 
       <tr> 
        <td>column1</td> 
        <td data-target="samename1"> 
         <label for="samename1">some html</label> 
        </td> 
        <td data-target="samename2"> 
         <label for="samename2">some html</label> 
        </td> 
        <td> 
         <a href="javacript:;" onclick="Edit(this,1)"><i class="fa fa-pencil"></i></a> 
         <a href="javacript:;" style="display:none" onclick="Cancel(this,'idofthisrow')"><i class="fa fa-times"></i></a> 
         <a href="javacript:;" style="display:none" onclick="Update(this,'idofthisrow')"><i class="fa fa-refresh"></i></a> 
         <a href="javacript:;" onclick="Delete(this,1)"><i class="fa fa-trash-o"></i></a> 
        </td> 
       </tr> 
     </tbody> 
    </table> 
</form> 

А затем столбцы, которые я не хотел редактировать, я помещал их в jQuery .not.

Попробуйте и дайте мне знать, если он работает

0

Попробуйте это в контроллере

 [HttpPost] 
    public ActionResult Edit(tbl_HolidayList tbl_holidaylist) 
    { 
     if (ModelState.IsValid) 
     { 

       List<tbl_HolidayList > holitemp = new List<tbl_HolidayList >(); 
      foreach (tbl_HolidayList item in objedit.tbl_HolidayList) 
      { 
       if (item.Holiday_Name== null || item.Holiday_Name.Trim() == "") 
       { 
        if (item.Holiday_Id!= 0) 
        { 
         db.Entry(item).State = EntityState.Modified; 
        } 
        else 
         holitemp .Add(item); 
       } 
       else if (item.Holiday_Id== 0) 
        db.tbl_HolidayList .Add(item); 

       else 
        db.Entry(item).State = EntityState.Modified; 


      } 

      foreach (tbl_HolidayList item in holitemp) 
      { 
       if (item.Holiday_Name== 0 || item.Holiday_Name== null) 
       { 
        objedit.tbl_HolidayList .Remove(item); 
       } 
      } 
+0

нуль входит в параметр, исключение исключения в SaveChanges() ' –

+0

, если null наступает, попробуйте вышеуказанное. –

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