[英]ASP.Net MVC strongly typed partial views and inherited properties
我正在使用MS MVC 3構建一個Web應用程序並遇到了一個問題,可能是由於我對模型綁定的理解存在漏洞。
首先,我有一個相當標准的模型(為簡潔省略了無關的東西,更改名稱以保護無辜對象的隱私):
public class ModelBase
{
public int Id { get; set; }
}
public class Order : ModelBase
{
public List<Product> Products { get; set; }
}
public class Product : ModelBase
{
public int OrderId { get; set;}
}
為了顯示和編輯這些,我有一個強類型的Order類,包含一個部分視圖,它是一個強類型的Product類。 局部視圖的頂部如下所示:
@model Product
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.OrderId)
//loads of actual editable properties
我將partial插入主視圖中,如下所示:
@Html.Partial("EditorTemplates/Product", Model.Products.First())
...當視圖在瀏覽器中呈現時,“Id”隱藏輸入包含訂單的ID,而不是我期望和需要的產品的ID :(
我錯過了什么? 可以在不改變模型和視圖結構的情況下修復嗎?
在更改我的測試項目時,我可以確認
/首頁/指數?ID = 33
要么
/首頁/索引/ 33
是否覆蓋模型值。 你能從網址中刪除這個參數嗎?
你必須改變結構。
您可以將部分內容放入主視圖中,也可以將部分內容強烈鍵入Order而不是Product,或使用Html.Hidden()構造隱藏字段。 MVC並沒有將完整路徑放在HiddenFor中相對於post post中的模型的項目中。
即。 在你會看到的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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.