Вы должны были бы изменить структуру.
Вы можете либо поместить частичное содержимое в главное представление, либо строго ввести частичное в Заказ, а не в Продукт, либо создать скрытое поле с помощью Html.Hidden ().MVC не помещает полный путь к элементу в HiddenFor относительно модели в вашем посте.
т.е.В html вы увидите
<input type="hidden" name="Id" />
, но вы действительно хотите
<input type="hidden" name="Products[0].Id" />
, чтобы различать поля и элементы.остается, когда вы пытаетесь POST два разных скрытых ввода с тем же именем, однако я также написал тестовый проект, который работает до клиента.
Надеюсь, это поможет:
Контроллер
public ActionResult Index()
{
Order order = new Order() { Id = 1 };
order.Products = new List<Product>() { new Product() { Id = 3, OrderId = 1 } };
return View("Order",order);
}
Модели
public class Order : IdentityBase
{
public List<Product> Products { get; set; }
}
public class Product : IdentityBase
{
public int OrderId { get; set; }
}
public class IdentityBase
{
public int Id { get; set; }
}
Вид
@model MvcApplication1.Models.Order
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Order</title>
</head>
<body>
<div>
@Html.HiddenFor(model => model.Id)
@foreach (MvcApplication1.Models.Product product in Model.Products)
{
<div class="product">
@Html.Partial("Product", product)
</div>
}
</div>
</body>
</html>
Частичный вид
@model MvcApplication1.Models.Product
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.OrderId)
HTML-код клиента
<!DOCTYPE html>
<html>
<head>
<title>Order</title>
</head>
<body>
<div>
<input id="Id" name="Id" type="hidden" value="1" />
<div class="product">
<input id="Id" name="Id" type="hidden" value="3" />
<input id="OrderId" name="OrderId" type="hidden" value="1" />
</div>
</div>
</body>