我在尝试将实体框架表单作为模型通过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>
。不确定这是否是一个问题,但我认为值得注意。
我需要知道为什么我在制造商的情况下收到一个完整的模型,但不是在汽车的情况下。
答案 0 :(得分:1)
假设您打算在控制器内发布CreateCar(Car model)
操作方法,
当您发布的表单数据包含名为Model
的项目时,它似乎是默认模型绑定器中的错误。如果您发布的数据没有带有键FormData
的{{1}}项,则模型绑定工作正常(因此您的制造商表单适合您)
如果您将属性名称从Model
更改为Model
ModelName
我会在了解更多内容后发布此答案的更新。