Об успехе Ajax-Jquery, как я могу заменить или добавить значения ячеек таблицы после отправки модальной формы в ASP.NET MVC5 C # - PullRequest
0 голосов
/ 08 октября 2018

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

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

Вот сценарий, который я поместил в конце моего частичного представления:

function btndbsave(obj) {
    var ele = $(obj);
    var id = ele.attr("data-model-id");
    var itemlist = [];
    var name = $("[name = 'NameTxtID']").val();
    var phone = $("[name = 'PhoneTxtID']").val();
    var email = $("[name ='EmailTxtID']").val();
    var AjaxVM = { Id: id, Name: name, Phone: phone, Email: email };
    itemlist.push(AjaxVM);


    console.log(itemlist)
    debugger;
    $.ajax({
        url: '/Home/Edit', //
        dataType: "json",
        data: JSON.stringify({ AjaxVM }),
        type: "POST",
        contentType: "application/json; charset=utf-8",
        success: function () {
            alert("success");
            $('#newmodal').modal('hide');
            $('#tbDetails>tbody>td').find("tr").html(AjaxVM);

            //$('#tbDetails').find("tbody>tr").append(itemlist);
        },
        error: function (xhr) {
            alert("error");
        }
    });
};

Частичное представление какМодальный:

<div class="modal-header">
    <h5 class="modal-title">Edit Record</h5>
    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
        <span aria-hidden="true">&times;</span>
    </button>
</div>

<div class="modal-body">
    <div class="form-horizontal">
        <div class="form-group">
            @Html.LabelFor(x => x.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(x => x.Name, "NameTxt", "NameTxtID", new { htmlAttributes = new { @class = "form-control col-md-6", @name = "Name[]" } })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(x => x.Phone, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(x => x.Phone, "PhoneTxt", "PhoneTxtID", new { htmlAttributes = new { @class = "form-control col-md-6", @name = "Phone[]" } })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(x => x.Email, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(x => x.Email, "EmailTxt", "EmailTxtID", new { htmlAttributes = new { @class = "form-control col-md-6", @name = "Email[]" } })
            </div>
        </div>
    </div>
</div>
<div class="modal-footer">
    <input type="button" class="btn btn-primary btnSave" data-model-id="@Model.Id" onclick="btndbsave(this)" value="Save changes">
    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>

Вот таблица вида:

 <table id="tbDetails" class="table table-bordered table-striped table-hover">
        <thead>
            <tr>
                <td>Id</td>
                <td>Name</td>
                <td>Phone</td>
                <td>Email</td>
                <td>Options</td>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
                <tr>
                    <td width="100" class="idField">@item.Id</td>
                    <td>@item.Name</td>
                    <td>@item.Phone</td>
                    <td>@item.Email</td>
                    <td>
                        <a class="delete" data-model-id="@item.Id" onclick="Delete(this)"><img src="/UserImages/delete.png" /></a>
                        <a class="edit-record" data-model-id="@item.Id" onclick="Edit(this)" ><img src="/UserImages/pencil.png" /></a>
                    </td>
                </tr>
            }
        </tbody>
    </table>

Вот это контроллер:

[HttpPost] 
public ActionResult Edit(Models.AjaxVM ajaxVM)
{
    using (var db = new PracticeEntities())
    {
        var checkforid = db.AjaxTable.Where(x => x.Id == ajaxVM.Id).FirstOrDefault();
        if (checkforid != null)
        {
            checkforid.Name = ajaxVM.Name;
            checkforid.Email = ajaxVM.Email;
            checkforid.Phone = ajaxVM.Phone;
            db.SaveChanges();
        }
        else
        {
            ModelState.AddModelError("error", "Record has not been Updated");
        }

        return Json(ajaxVM);
    }

}

Метод редактирования в отдельном файле JS:

function Edit(obj) {
debugger;
var ele = $(obj);
var url = "/Home/Edit"; // the url to the controller
var id = ele.attr('data-model-id'); // the id that's given to each button in the list
$.get(url + '/' + id, function (data) {
    $('#newmodal').find(".modal-content").html(data);
    $('#newmodal').modal('show');
});
};

1 Ответ

0 голосов
/ 08 октября 2018

Во-первых, использование EditorFor() не имеет смысла, и его использование должно быть просто

 @Html.EditorFor(x => x.Name, "new { htmlAttributes = new { @class = "form-control col-md-6" } })

Далее, сценарий для сохранения данных должен быть

function btndbsave(obj) {
    var ele = $(obj);
    var id = ele.attr("data-model-id");
    var name = $("#Name]").val();
    var phone = $("#Phone").val();
    var email = $("#Email").val();
    var AjaxVM = { Id: id, Name: name, Phone: phone, Email: email };

    $.ajax({
        url: '@Url.Action("Edit", "Home")', // don't hard code your url's
        dataType: "json",
        data: AjaxVM,
        type: "POST",
        success: function (response) {
            .... // see notes below
        },
        error: function (xhr) {
            alert("error");
        }
    });
};

Примечание однакочто ваш модал должен включать в себя код <form> и @Html.ValidationMessageFor(), чтобы дать вам проверку на стороне клиента, а также кнопку отправки, чтобы ваш скрипт стал

$('form').submit(function(e) { // or give the form an id attribute and use that
    e.preventDefault();
    ... // make ajax call
});

Далее, ваш метод контроллера должен только возвращать значениеуказывающий успех или иное (вместе с любым сообщением об ошибке, если применимо), например

return Json(new { success = true }); // if saved
return Json(new { success = false, message = "...." }); if not saved

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

, а затемпри обратном вызове ajax вы обновляете элементы <td> успешно (или отображаете ошибку, если нет).Для этого включите глобальную переменную javascript для хранения текущей строки

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

<a class="edit-record" data-model-id="@item.Id" href="#" ><img src="/UserImages/pencil.png" /></a>

, а скрипт - на

var currentrow;
$('.edit-record').click(function() {
    currentrow = $(this).closest('tr'); // assign the current row
    ... // load and display the modal
});

$.ajax({
    ....
    success: function (response) {
        if (response.success) {
            // Update the current row
            var cells = currentrow.find('td');
            cells.eq(1).text(name);
            cells.eq(2).text(phone);
            cells.eq(3).text(email);
        } else {
            ... // oops - display the message in response.message?
        }
    }
....
}

Обратите внимание, что нет необходимости совершать ajax-вызов для загрузки модального режима, поскольку у вас уже есть все данные в представлении.Вместо этого включите html для редактирования AjaxVM в начальном представлении, например, используя

@Html.Partial(""_Edit", new AjaxVM())

, затем обновите значения входных данных при отображении модального

$('.edit-record').click(function() {
    currentrow = $(this).closest('tr');
    var cells = currentrow.find('td');
    $('#Name').val(cells.eq(1).text());
    $('#Phone').val(cells.eq(2).text());   
    $('#Email').val(cells.eq(3).text()); 
    $('#newmodal').modal('show');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...