Как получить конкретные данные модели из успеха AJAX с частичным представлением - PullRequest
2 голосов
/ 20 июня 2019

Я хочу получить конкретное значение модели в ajax success. Я не могу использовать результат Json здесь, потому что мне также нужно загрузить значение модели в контейнер div с частичным представлением.

Вот моя модель

public class ProductModel
{
    public int ProductId { get; set; }

    public decimal? Cost { get; set; }

    public string Description { get; set; }

    public bool IsCostUpdated { get; set; }
}

Я хочу получить значение IsCostUpdated только в ajax success. В контроллере я должен вернуть строго типизированное частичное представление. Вот код

[HttpPost]
public ActionResult CheckProductCost(ProductModel model)
    {
        ModelState.Clear();
        using (var db = DataContext.Db)
        {
            model.IsCostUpdated = model.CheckUpdate(db);
        }

        return PartialView("ProductDataTable", model);
    }

это мой код вызова Ajax

$.ajax({
        url: productCostUrl,
        dataType: 'html',
        type: 'POST',
        data: $('body').find('.productTable').closest('.dataComponent').find(':input').serialize(),
        success: function (d) {
            var isSuccess = d.IsCostUpdated; [I want this value]

           $('body').find('.productTable').html(d)
        }
    });

Ответы [ 4 ]

0 голосов
/ 20 июня 2019

Внутри этого обратного вызова AJAX Success у вас есть доступ к объекту данных, который вы называете «d» в вашем обратном вызове.

Попробуйте console.log(d), и вы увидите, что у объекта d есть responseJSONимущество.Это то, что вам нужно для доступа к вашей собственности.

Вместо того, чтобы делать: var isSuccess = d.IsCostUpdated; [I want this value] try var isSuccess = d.responseJSON.IsCostUpdated;

Еще одна важная вещь, если вы хотите передать данные с вашего контроллера в ваш вызов ajaxпопробуйте сделать: return Ok(model) вместо частичного возврата.Если вы вернете частичное представление, HTML-код этой страницы будет передан в качестве данных ответа вашему объекту данных в обратном вызове Ajax Success.

0 голосов
/ 20 июня 2019

Вы не возвращаете данные.Вы возвращаете частичное представление.

return PartialView("ProductDataTable", model);

Если вы хотите вернуть только значение, которое возвращает ваш CheckProductCost, то вы, вероятно, можете сделать как.

return Json(model);
0 голосов
/ 20 июня 2019

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

return Json(new
                    {
                        view = RenderRazorViewToString(ControllerContext, "ProductDataTable", model),
                        IsCostUpdated = model.IsCostUpdated
                    });


// Render Razor view as string to populate dom
public static string RenderRazorViewToString(ControllerContext controllerContext, string viewName, object model)
        {
            controllerContext.Controller.ViewData.Model = model;
            using (var sw = new StringWriter())
            {
                var ViewResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName);
                var ViewContext = new ViewContext(controllerContext, ViewResult.View, controllerContext.Controller.ViewData, controllerContext.Controller.TempData, sw);
                ViewResult.View.Render(ViewContext, sw);
                ViewResult.ViewEngine.ReleaseView(controllerContext, ViewResult.View);
                return sw.GetStringBuilder().ToString();
            }
        }

// Razor View - Ajax call Success
success: function (data) {
                    $('body').find('.productTable').html(data.view);
                    var isSuccess = data.IsCostUpdated;
                }

0 голосов
/ 20 июня 2019

Вы можете вернуть JsonResult в вашем текущем ActionResult.Просто проверьте, является ли данный запрос ajax запросом.Ваш ActionResult станет примерно таким:

[HttpPost]
public ActionResult CheckProductCost(ProductModel model)
{
    ModelState.Clear();
    using (var db = DataContext.Db)
    {
        model.IsCostUpdated = model.CheckUpdate(db);
    }

    if (Request.IsAjaxRequest()) // THIS IS AVAILABLE INSIDE THE SYSTEM.WEB.MVC ASSEMBLY
        return Json(new { IsCostUpdated = model.IsCostUpdated });

    return PartialView("ProductDataTable", model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...