1

Я новичок в MVC, я пытаюсь редактировать строку и отправлять измененные данные в контроллер с помощью jQuery и AJAX, когда я нажимаю на редактирование, определенная строка становится текстовыми полями и saveActionLink появляется вместо edit, но когда я его сохраняю, это дает мне исключение. enter image description hereДанные не поступают в контроллер - MVC

вот мой JQuery/AJAX:

@model IEnumerable<OTESSystem.Models.tbl_HolidayList> 

@{ 
    ViewBag.Title = "Index"; 
} 


<script src="~/Scripts/jquery-1.8.2.min.js"></script> 
<script src="~/Scripts/jquery-ui-1.8.24.min.js"></script> 
<link href="~/Content/themes/base/jquery-ui.css" rel="stylesheet" /> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      function toggleEditability() { 
       $(this).closest('tr') 
         .find('a.Edit, a.Save, .displayText, input[type=text]') 
         .toggle(); 
      } 

      $('a.Edit').click(toggleEditability); 

      $('a.Save').click(function() { 
       toggleEditability.call(this); 
       var data = $(this).closest('form').serialize(); 
       //var url = $(this).attr('href'); 
       var actionURL = '@Url.Action("Edit", "Holiday")'; 
       $.ajax({ 
        url: actionURL,    // Url to send request to 
        data:data,   // Send the data to the server 
        type: "POST",   // Make it a POST request 
        dataType: "html",  // Expect back HTML 
        success: function (html) { 
         $("#dialog-edit").dialog('open');  // 
        } 
       }); 
      }); 
     }); 
    </script> 

CHTML код:

<div id="details"> 
    <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) 
    { 
     if (Convert.ToDateTime(item.Holiday_date).Year.ToString() == DateTime.Now.Year.ToString()) 
     { 
      <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> 
       @Html.ActionLink("Edit", "Edit", new { id = item.Holiday_Id }, new { @class = "Edit", Href="#" }) 
       @Html.ActionLink("Save", "Save", new { id = item.Holiday_Id}, new { @class = "Save", Href = "#", style = "display:none" }) | 
       @Html.ActionLink("Delete", "Delete", new { id = item.Holiday_Id }, new { @class = "lnkDelete" }) 
       @Html.ActionLink("Cancel", "Cancel", new { id = item.Holiday_Id}, new { @class = "Cancel", Href = "#", style = "display:none" }) 
      </td> 
     </tr> 
     } 

    } 

    </table> 

    </div> 

метод контроллера Код:

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 PartialView(tbl_holidaylist); 
     } 

tbl_HolidayList.cs

namespace OTESSystem.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class tbl_HolidayList 
    { 
     public int Holiday_Id { get; set; } 
     public string Holiday_Name { get; set; } 
     public string Holiday_Description { get; set; } 
     public Nullable<System.DateTime> Holiday_date { get; set; } 
    } 
} 

Можете ли вы сказать мне, почему я получаю это исключение?

+0

Как вы создать экземпляр контекста класса? –

+1

Какие свойства находятся в вашем классе 'tbl_HolidayList', а имена свойств соответствуют именам полей в вашей сериализованной форме? Предполагая, что запрос POST содержит данные, проблема заключается в C# mapper. –

+0

Я обновил свой вопрос с помощью кода 'tbl_HolidayList.cs', а имена свойств совпадают с именами полей. –

ответ

0

это работало для меня

1

Вы задали аналогичный вопрос раньше, и главная проблема - та же проблема, что и раньше. Вы не можете использовать foreach петлю @Html.TextBoxFor и т.д. Вы должны использовать цикл и Индексация на выражениях:

Problem 1:

например

@for (int i = 0; i < Model.Count(); i++) 
{ 
    [snip] 
    <td> 
      @Html.TextBoxFor(m => Model[i].Holiday_Name, new { style = "display: none; width:170px; height:15px" }) 
      <div class="displaytext"> 
      @Html.DisplayFor(m => Model[i].Holiday_Name) 
      </div> 
    </td> 
    [snip] 
} 

Проблема заключается в том, что дерево выражения передается TextBoxFor потребности иметь знание значения индекса для того, чтобы правильно генерировать индексированные имена. Локальная переменная, предоставленная foreach, не имеет представления о том, какая позиция была в его родительской коллекции.

Задача 2

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

Попробуйте просто serialising в одну строку, то неправильное называние элементов должны реально работать в вашу пользу:

var data = $(this).closest('tr').serialize(); 

Другие вопросы

Ваша страница в настоящее время принимает IEnumerable<OTESSystem.Models.tbl_HolidayList> коллекцию предметов. Обычно вы делаете их с помощью цикла for (не для каждого - см. Проблему 1). Затем вы отправите назад всю страницу, чтобы ваш метод edit также должен использовать IEnumerable<OTESSystem.Models.tbl_HolidayList>

например.

public ActionResult Edit(IEnumerable<tbl_HolidayList> tbl_holidaylist) 
{ 
     foreach(var holiday in tbl_holidaylist) 
     { 
      //save changes 
     } 
} 

В принципе, на вашей странице происходит два противоречивых события.Вы должны решить, стоит ли идти в ногу со стандартной практикой MVC или против них :)

+0

его давая мне ошибку 'Дерево выражений my no содержат динамическую операцию' –

+0

Не могу ли я сделать это с помощью цикла foreach? –

+0

@Umm E Habiba Siddiqui: повторяющиеся записи с использованием 'TextBoxFor',' EditorFor' и т. Д. В MVC * абсолютно не будут работать * с циклами foreach. Сожалею. Они будут просто отображать дублированные именованные элементы, а не возвращаться правильно. –

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