簡體   English   中英

ASP.Net MVC強類型部分視圖和繼承屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM