AJAX将模型视图发布到我的控制器

时间:2018-04-17 13:34:59

标签: ajax asp.net-mvc asp.net-core asp.net-core-mvc asp.net-ajax

我正在建立一个主持人可以在某个电脑部分的网站。这只是我网站上的一个表单。我希望表单通过AJAX发布,因此在添加部件后它不会刷新。我正在用ASP.net Core 2.0制作应用程序

这是我的观点:

    @model PcBuildAddViewModel
@{
    ViewData["Title"] = "Add";
}
<div class="form-container">
    <form id="AddPcForm" class="form-wrapper" method="post">
        <p>Name:</p>
        <input asp-for="@Model.PcPart._Name" type="text" class="form-control"/>
        <br/>
        <p >Type:</p>
        <div class="form-select">
            <select asp-for="@Model.PcPart._Type" asp-items="@Model.AllTypes">
            </select>
        </div>
        <br/>
        <p>Info:</p>
        <input asp-for="@Model.PcPart.Information" type="text" class="form-control"/>
        <br/>
        <p>Properties:</p>
        <div class="form-select">
            <select asp-for="@Model.Properties" asp-items="@Model.AllProperties" multiple="multiple">
            </select>
        </div>
        <br/>
        <p>Image:</p>
        <input asp-for="@Model.Image" type="file" class="inputfile inputfile-1"/>
        <label asp-for="@Model.Image">
            <svg xmlns="http://www.w3.org/2000/svg" width="20" height="17" viewBox="0 0 20 17">
            </svg> <span>Choose a file&hellip;</span>
        </label>
        <br/>
        <button class="btn btn-1 btn-1e" type="submit">
            <span>Add</span>
        </button>
    </form>
</div>

我希望通过AJAX发布的视图模型:

public class PcBuildAddViewModel
{
    public List<SelectListItem> AllProperties { get; } = new List<SelectListItem>();
    public List<SelectListItem> AllTypes { get; } = new List<SelectListItem>();
    public IFormFile Image { get; set; }
    public PcPart PcPart { get; set; }
    public List<int> Properties { get; set; }

    public PcBuildAddViewModel()
    {
    }

    public PcBuildAddViewModel(List<Propertie> allProperties, List<string> allTypes)
    {            
        foreach (string type in allTypes)
        {
            SelectListItem listItem = new SelectListItem
            {
                Text = type,
                Value = type
            };
            AllTypes.Add(listItem);
        }

        foreach (Propertie propertie in allProperties)
        {
            SelectListItem listItem = new SelectListItem
            {
                Text = propertie._Value,
                Value = propertie.Id.ToString()
            };
            AllProperties.Add(listItem);
        }
    }
}

我希望收到表单的行动发布方法:

[HttpPost]
        public IActionResult AddPcPart(PcBuildAddViewModel viewModel) 
        {
            return RedirectToAction("Add");
        }

最终我的AJAX:

$('#AddPcForm').on('submit', function(event) {

        var viewModel = $(this).serialize();


        ajaxPost("/PCBuild/AddPcPart", viewModel);

        event.preventDefault();
    });
function ajaxPost(ul, dt) {
        $.ajax({
            type: "POST",
            url: ul,
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            data: dt,
            success: ajaxSucces,
            error: function(result) {
                console.log(result);
            }
        });
    }

我希望有人可以帮助我。我没有使用AJAX就尝试了这个,但是当我通过AJAX调用时,它运行良好。我得到一个空的viewmodel或者当我在控制器中将[Frombody]放在我的参数前面时,我得到一个null视图模型。

1 个答案:

答案 0 :(得分:0)

感谢Stephen Muecke发布了答案。问题是contentType需要是默认值,所以我只删除了我的AJAX帖子中的contentType参数。之后我删除了[FromBody]因为不再需要了。