chaturvedi_anshumaan_20191 Ответов: 1

Как обновить записи в представлении, а затем запустить хранимую процедуру для обновления фактических данных в базе данных?


У меня есть следующий метод действия контроллера.


public int BulkUpdate(List<Employee> employees)
         {

           Connection();
           employees = GetAllEmployees().ToList();
            // using reflection, i mean why did i use this ??
            //used it for converting the generic list into datatables.
           DataTable dt = new DataTable(typeof(Employee).Name);
           PropertyInfo[] props = typeof(Employee).GetProperties(BindingFlags.Public | BindingFlags.Instance);
           foreach (var prop in props)
           {
               dt.Columns.Add(prop.Name);
           }

           foreach (var employee in employees)
           {
               var values = new object[props.Length];
               for (int i = 0; i < props.Length; i++)
               {
                   values[i] = props[i].GetValue(employee, null);
               }

               dt.Rows.Add(values);
           }
           //
           using (SqlCommand cmd = new SqlCommand("BulkUpdateEmployee", con))
           {
               cmd.CommandType = CommandType.StoredProcedure;
               SqlParameter parameter = cmd.Parameters.AddWithValue("@tblEmployeeType", dt);
               parameter.SqlDbType = SqlDbType.Structured;
               parameter.TypeName = "dbo.EmployeeType";


               con.Open();
               var rowsAffected = cmd.ExecuteNonQuery();
               con.Close();

               return rowsAffected;
           }//using ends here

       }



и этот метод вызывается в главном контроллере:


[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
       public JsonResult BulkUpdateOrInsert(List<Employee> employees)
       {
           int rowsAffected=empRepo.BulkUpdate(employees);
           return Json(rowsAffected, JsonRequestBehavior.AllowGet);

       }



а это и есть файл представления :


@using System.Collections
@model IEnumerable<Employee_Management_System.Models.Employee>

@{
    ViewBag.Title = "BulkUpdateOrInsert";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<!DOCTYPE html>
<html>

<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js"></script>
    <script type="text/javascript">
    $("body").on("click", "#btnSave", function() {
            //Have to Loop through the Table rows and build a JSON array maybe try passing it to Controller action.
        var employees = new Array();
            debugger;
            $("#tblEmployees tbody tr").each(function() {
                var row = $(this);
                var employee = {};
            employee.Name = row.find("td").eq(0).html();
            employee.City = row.find("td").eq(1).html();
            employee.Department = row.find("td").eq(2).html();
            employee.Gender = row.find("td").eq(3).html();
            employees.push(employee);
        });
    </script>
    @*end of section script*@

    <script type="text/javascript">
                $.ajax({
                    type: "POST",
                url: "/Employee/BulkUpdateOrInsert",
                data: JSON.stringify(employees),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                    success: function(r) {
                    alert(r + " record(s) inserted.");
            }
});
    </script>
</head>
<body>
    <h2>BulkUpdateOrInsert</h2>


    @using (Html.BeginForm("BulkUpdateOrInsert", "Employee", "POST"))
    {
        @Html.AntiForgeryToken()


        <h4>Employee</h4>
        <hr />

        <table class="table" id="tblEmployees">
            <thead>
                <tr>
                    <th>
                        @Html.DisplayNameFor(model => model.Name)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.City)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.Department)
                    </th>
                    <th>
                        @Html.DisplayNameFor(model => model.Gender)
                    </th>
                    <th></th>
                </tr>
            </thead>

            @foreach (var item in Model)
            {
                <tbody>
                <tr>
                    <td>@Html.HiddenFor(modelItem => item.EmployeeId)</td>
                    <td>
                        @Html.EditorFor(modelItem => item.Name)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.City)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.Department)
                    </td>
                    <td>
                        @Html.EditorFor(modelItem => item.Gender)
                    </td>
                    <td>
                        @Html.ActionLink("Edit", "Edit", new {id = item.EmployeeId}) |
                        @Html.ActionLink("Details", "Details", new {id = item.EmployeeId}) |
                        @Html.ActionLink("Delete", "Delete", new {id = item.EmployeeId})
                    </td>
                </tr>
                </tbody>
            }

        </table>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" id="btnSave" value="Save All" class="btn btn-default" />
            </div>
        </div>
        <div>
            @Html.ActionLink("Back to List", "Index")
        </div>
        @section Scripts {
            @Scripts.Render("~/bundles/jqueryval")
        }
    }
</body>

</html>


Проблема заключается в том, что представление не загружается для обновления записей.
Мое требование состоит в том, чтобы загрузить представление с уже существующими данными в базе данных.
Отредактируйте записи,верните общий список обновленных записей - > преобразуйте их в Datatable и передайте этот datatable в хранимую процедуру.(это я уже сделал).Проблема в том, что я не могу загрузить представление для обновления записей в базе данных.

Что я уже пробовал:

Я понятия не имею, как подойти к этому вопросу.

1 Ответов

Рейтинг:
1

Mehul M Thakkar

Не смешивайте метод Get и Post/Put.
Напишите jQuery $(документ).метод ready() для загрузки всех ваших записей из БД с помощью метода Get.
На Post вы можете отправить все записи и сохранить или обновить их, для этого вы можете вызвать метод Post/Put


chaturvedi_anshumaan_20191

Вы имеете в виду что-то вроде этого?

$(документ).готово(функция () {
$('#tblEmployees').готово({
$.Аякс{
тип: "почта",
url: "/Employee/Index",
сведения: в формате JSON.преобразовать в строки(сотрудников),
contentType: "application/json; charset=utf-8",
тип данных: "json"
});

chaturvedi_anshumaan_20191

то, что я написал, Я считаю неправильным.

Mehul M Thakkar

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

Richard Deeming

NB: Взгляните на это документация по jQuery[^] - $(document).ready(function(){ ... }) является устаревшим в пользу $(function(){ ... }):

"jQuery предлагает несколько способов прикрепить функцию, которая будет работать, когда DOM будет готов. Все следующие синтаксисы эквивалентны:

* $( handler )
* $( document ).ready( handler )
* $( "document" ).ready( handler )
* $( "img" ).ready( handler )
* $().ready( handler )

Начиная с jQuery 3.0, рекомендуется использовать только первый синтаксис; остальные синтаксисы все еще работают, но устарели."