使用AJAX将实体框架表单作为模型发送到控制器

时间:2017-11-18 19:29:14

标签: c# jquery ajax asp.net-mvc entity-framework-core

我在尝试将实体框架表单作为模型通过ajax发送到我的控制器时遇到了问题。问题是在某些情况下它不会传递空模型。这就是我所拥有的:

Manufacturer.cs

public class Manufacturer 
{
    [HiddenInput(DisplayValue = false)]
    public int ManufacturerID { get; set; }

    public string Name { get; set; }
}

Car.cs

public class Car
{
    [HiddenInput(DisplayValue = false)]
    public int CarID { get; set; }

    public string Model { get; set; }
    public int ManufacturerID { get; set; }
    public int Year { get; set; }
    public decimal Mpg { get; set; }
}

Manufacturers.cshtml

<div id="manufacturer-list">
    @Html.Partial("ManufacturerList")
</div>
<div id="manufacturer-form">
    @Html.Partial("ManufacturerForm")
</div>

ManufacturerForm.cshtml

@model Manufacturer

<form id="create-manufacturer-form" method="post">
    @Html.EditorForModel()
    <a onclick="CreateEntity('@Url.Action("CreateManufacturer", "Home")', 'manufacturer')">Add Manufacturer</a>
</form>

Cars.cshtml

<div id="car-list">
    @Html.Partial("CarList")
</div>
<div id="car-form">
    @Html.Partial("CarForm")
</div>

CarForm.cshtml

@model Car

<form id="create-car-form" method="post">
    @Html.EditorForModel()
    <a onclick="CreateEntity('@Url.Action("CreateCar", "Home")', 'car')">Add Car</a>
</form>

的Javascript

function CreateEntity(createAction, modelType) {
    var $form = $('#create-' + modelType + '-form');

    $.ajax({
        type: "POST",
        url: createAction,
        data: $form.serialize(),
        dataType: 'html',
        success: function (data) {
            //do stuff
        }
    });
}

控制器

public class HomeController : Controller
{
    private readonly CarsDbContext _context;

    public HomeController(CarsDbContext context)
    {
        _context = context;
    }

    [HttpPost]
    public IActionResult CreateManufacturer(Manufacturer model)
    {
        //do stuff
    }

    [HttpPost]
    public IActionResult CreateCar(Car model)
    {
        //do stuff
    }
}

因此,如果填写制造商表单并提交$form.serialize(),则会"ManufacturerID=0&Name=Toyota"。 Controller操作接收带有给定值的完整模型,我可以使用Entity Framework将该模型添加到我的数据库中。

当试图用汽车做同样的事情时,问题出现了。我填写表格并提交。 $form.serialize()提供类似"CarID=0&Model=Camry&ManufacturerID=1&Year=2010&Mpg=24.4"的内容。在这种情况下,Controller操作会收到一个空模型,其中任意值字段为0,字符串字段为null

对创建的DOM元素的进一步检查显示,为制造商创建的表单具有以value="0">结尾的ManufacturerID的隐藏输入字段,并且CarID的相同隐藏输入具有属性value>。不确定这是否是一个问题,但我认为值得注意。

我需要知道为什么我在制造商的情况下收到一个完整的模型,但不是在汽车的情况下。

1 个答案:

答案 0 :(得分:1)

假设您打算在控制器内发布CreateCar(Car model)操作方法,

当您发布的表单数据包含名为Model的项目时,它似乎是默认模型绑定器中的错误。如果您发布的数据没有带有键FormData的{​​{1}}项,则模型绑定工作正常(因此您的制造商表单适合您)

如果您将属性名称从Model更改为Model

,则应该有效
ModelName

我会在了解更多内容后发布此答案的更新。