MVC5 复杂对象形式
MVC5 Complex Object Form
我正在创建拍卖。 Auction 对象有很多对象作为属性,例如:
Auction
-[Property]
-[Neighborhood]
-[Agent]
-source
-clientId
-reserve
Property
-Street
-City
-State
-Zip
Agent
-Name
-Email
-Telephone
Neighborhood
-Name
-HOA Fee
所以基本上我必须创建一个多选项卡视图来更新拍卖对象。
标签为:拍卖、属性、代理、社区
不幸的是,有人要求我将其他对象的属性放入选项卡中。例如,Neighborhood 选项卡将具有 Property.Zip,而 属性 选项卡将具有 Auction.ClientId.
所以我所做的是为视图中的每个选项卡创建一个部分。下面是一个简化的示例。
@Model Auction
@using(Html.BeginForm("Update", "Auction", HttpMethod.Post, new {})
{
<div class="panel">
@Html.Partial("_AuctionTab")
</div>
<div class="panel">
@Html.Partial("_PropertyTab")
</div>
<div class="panel">
@Html.Partial("_AgentTab")
</div>
<div class="panel">
@Html.Partial("_NeighborhoodTab")
</div>
<button>Submit</button>
}
部分均采用拍卖模式。
这是 _属性Tab 部分的示例:
@Model Auction
@Html.LabelFor(m=> m.ClientId)<br/>
@Html.EditorFor(m=> m.ClientId)<br/><br/>
@Html.LabelFor(m=> m.Property.Street)<br/>
@Html.EditorFor(m=> m.Property.Street)<br/><br/>
@Html.LabelFor(m=> m.Property.City)<br/>
@Html.EditorFor(m=> m.Property.City)<br/><br/>
@Html.LabelFor(m=> m.Property.State)<br/>
@Html.EditorFor(m=> m.Property.State)<br/><br/>
@Html.LabelFor(m=> m.Property.Zip)<br/>
@Html.EditorFor(m=> m.Property.Zip)<br/><br/>
@Html.LabelFor(m=> m.Property.Street)<br/>
@Html.EditorFor(m=> m.Property.Street)<br/><br/>
问题是,当我点击提交时,除了第一个部分的值外,返回到更新操作的拍卖大部分为空。就该怎么做而言,我有点把头撞在墙上。
基本上提交按钮必须保存整个拍卖。有什么关于方法和最佳实践的建议吗?
谢谢!
模型绑定无法帮助您实现 属性、代理等导航属性
您可以改用 ViewModel 来实现此目的。
并且您的控制器会将视图模型作为参数而不是拍卖对象。
Public class AuctionViewModel
{
public int ClientId {get; set;}
public string Street {get; set;}
//the rest of them.
}
您的视图现在将使用 @model AuctionViewModel
而不是拍卖。
您的查询将专门进行投影以检索 AuctionViewModel
而不是拍卖。
首先,当您调用分部视图时,您需要像这样设置模型属性:
@Html.Partial("_AuctionTab", Model)
另一方面,我建议您定义 ViewModel 而不是使用业务实体。它会给你更多的灵活性,你不需要制作依赖于拍卖的局部视图。此外,如果您被要求提供不属于拍卖对象的计算值或 属性,您可以轻松完成。您应该在控制器中构建 ViewModel 对象。
我正在创建拍卖。 Auction 对象有很多对象作为属性,例如:
Auction
-[Property]
-[Neighborhood]
-[Agent]
-source
-clientId
-reserve
Property
-Street
-City
-State
-Zip
Agent
-Name
-Email
-Telephone
Neighborhood
-Name
-HOA Fee
所以基本上我必须创建一个多选项卡视图来更新拍卖对象。
标签为:拍卖、属性、代理、社区
不幸的是,有人要求我将其他对象的属性放入选项卡中。例如,Neighborhood 选项卡将具有 Property.Zip,而 属性 选项卡将具有 Auction.ClientId.
所以我所做的是为视图中的每个选项卡创建一个部分。下面是一个简化的示例。
@Model Auction
@using(Html.BeginForm("Update", "Auction", HttpMethod.Post, new {})
{
<div class="panel">
@Html.Partial("_AuctionTab")
</div>
<div class="panel">
@Html.Partial("_PropertyTab")
</div>
<div class="panel">
@Html.Partial("_AgentTab")
</div>
<div class="panel">
@Html.Partial("_NeighborhoodTab")
</div>
<button>Submit</button>
}
部分均采用拍卖模式。
这是 _属性Tab 部分的示例:
@Model Auction
@Html.LabelFor(m=> m.ClientId)<br/>
@Html.EditorFor(m=> m.ClientId)<br/><br/>
@Html.LabelFor(m=> m.Property.Street)<br/>
@Html.EditorFor(m=> m.Property.Street)<br/><br/>
@Html.LabelFor(m=> m.Property.City)<br/>
@Html.EditorFor(m=> m.Property.City)<br/><br/>
@Html.LabelFor(m=> m.Property.State)<br/>
@Html.EditorFor(m=> m.Property.State)<br/><br/>
@Html.LabelFor(m=> m.Property.Zip)<br/>
@Html.EditorFor(m=> m.Property.Zip)<br/><br/>
@Html.LabelFor(m=> m.Property.Street)<br/>
@Html.EditorFor(m=> m.Property.Street)<br/><br/>
问题是,当我点击提交时,除了第一个部分的值外,返回到更新操作的拍卖大部分为空。就该怎么做而言,我有点把头撞在墙上。
基本上提交按钮必须保存整个拍卖。有什么关于方法和最佳实践的建议吗?
谢谢!
模型绑定无法帮助您实现 属性、代理等导航属性
您可以改用 ViewModel 来实现此目的。
并且您的控制器会将视图模型作为参数而不是拍卖对象。
Public class AuctionViewModel
{
public int ClientId {get; set;}
public string Street {get; set;}
//the rest of them.
}
您的视图现在将使用 @model AuctionViewModel
而不是拍卖。
您的查询将专门进行投影以检索 AuctionViewModel
而不是拍卖。
首先,当您调用分部视图时,您需要像这样设置模型属性:
@Html.Partial("_AuctionTab", Model)
另一方面,我建议您定义 ViewModel 而不是使用业务实体。它会给你更多的灵活性,你不需要制作依赖于拍卖的局部视图。此外,如果您被要求提供不属于拍卖对象的计算值或 属性,您可以轻松完成。您应该在控制器中构建 ViewModel 对象。