简体   繁体   English

使用 ajax 将值从 MVC 视图传递到 Controller

[英]Passing value from MVC View to Controller using ajax

I am developing web app with asp.net core 3.1.我正在使用 asp.net 核心 3.1 开发 web 应用程序。 I have an ajax call sends a ConsultViewModel object to my controller, but in controller it is getting null. I have an ajax call sends a ConsultViewModel object to my controller, but in controller it is getting null. I don't understand my error.我不明白我的错误。 I changed the ajax "data: JSON.stringify({consultView: consultView})" to "data: JSON.stringify(consultView)" but error persist.我将 ajax “数据:JSON.stringify({consultView:consultView})”更改为“数据:JSON.stringify(con)”但错误仍然存在How do i solve this problem?我该如何解决这个问题?

My code is just as follow:我的代码如下:

ViewModel视图模型

public class ConsultViewModel
{
    public int Id { get; set; }
    [Range(1, int.MaxValue, ErrorMessage = "Select a Department")]
    public int DepartmentId { get; set; }
    [Required]
    public string Description { get; set; }
    public string Date { get; set; }
    public IEnumerable<SelectListItem> Department { get; set; }
}

View看法

@model MyApp.AppWeb.Models.ConsultViewModel;

    <h1>Edit</h1>
    <form asp-action="Edit">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <input type="hidden" asp-for="Id" />

        <div class="form-group">
            <label asp-for="DepartmentId" class="control-label"></label>
            <select asp-for="DepartmentId" asp-items="Model.Department" class="form-control"></select>
            <span asp-validation-for="DepartmentId" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="Dateate" class="control-label"></label>
            <input asp-for="Date" class="form-control" disabled />
            <span asp-validation-for="Date" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="Description" class="control-label"></label>
            <textarea asp-for="Description" class="form-control" cols="40" rows="5"></textarea>
            <span asp-validation-for="Description" class="text-danger"></span>
        </div>

        <div id="@Model.Id" class="form-group">
            <input type="button" class="btn btn-primary" value="Save" id="btnEdit"/>
        </div>
    </form>

Scripts脚本

@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}

<script type="text/javascript">
    $(document).ready(function () {
        $('#btnEdit').click(function () {
            var id = $(this).parent()[0].id;
            var consultView = {
                Id: id,
                DepartmentId: $('#DepartmentId').val(),
                Date: $('#Date').val(),
                Description: $('#Description').val()
            };

            $.ajax({
                type: 'POST',
                url: "@Url.Action("Editar")",
                contentType: "application/json; charset=utf-8",
                dataType: 'json',
                data: JSON.stringify({consultView: consultView}), 
                success: function (data) {
                    alert(data.message);
                },
                error: function (ex) {
                    alert('Error.' + ex);
                }
            });
        });
    });
</script>

} }

[HttpPost]
    //[ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(ConsultViewModel consultView)
    {
        if (ModelState.IsValid)
        {
            //More code..

            return Json(new { success = true, message = "Done." });               
        }

        return View(consultaView);
    }

Thank!感谢!

I have an ajax call sends a ConsultViewModel object to my controller, but in controller it is getting null. I have an ajax call sends a ConsultViewModel object to my controller, but in controller it is getting null.

You can try to modify the code to stringify your JavaScript object consultView directly, need not to construct a new JavaScript object {consultView: consultView} . You can try to modify the code to stringify your JavaScript object consultView directly, need not to construct a new JavaScript object {consultView: consultView} .

data: JSON.stringify(consultView),

Besides, apply [FromBody] attribute to parameter like below.此外,将[FromBody]属性应用于如下参数。

public async Task<IActionResult> Edit([FromBody]ConsultViewModel consultView)
{

Testing data that I sent我发送的测试数据

在此处输入图像描述

Posted data can be bound as expected发布的数据可以按预期绑定

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM