2015-07-12 80 views
1

我正在创建拍卖。拍卖对象有很多对象作为属性,如:MVC5复杂对象表单

Auction 
-[Property] 
-[Neighborhood] 
-[Agent] 
-source 
-clientId 
-reserve 

Property 
    -Street 
    -City 
    -State 
    -Zip 
Agent 
    -Name 
    -Email 
    -Telephone 
Neighborhood 
    -Name 
    -HOA Fee 

所以基本上我必须创建一个多选项卡视图来更新拍卖对象。

选项卡有:拍卖,房地产,代理,邻居

不幸的是,我一直要求把性能从其他对象的标签。所以或者例如“邻居”选项卡将具有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> 
} 

部分都使用拍卖模式。

这里的_PropertyTab部分的一个例子:

@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/> 

的问题是,当我点击提交,拍卖返回更新动作大多是空除了第一部分的值。在这里,我的头撞在墙上,直到做什么。

基本上提交按钮必须保存整个拍卖。任何关于方法和最佳实践的建议?

谢谢!

回答

1

模型结合并没有帮助你像物业,代理等

导航性能,您可以使用一个ViewModel,而不是实现这一目标。

而您的控制器会将viewmodel作为参数而不是拍卖对象。

Public class AuctionViewModel 
{ 
    public int ClientId {get; set;} 
    public string Street {get; set;} 
//the rest of them. 

} 

您的看法现在使用@model AuctionViewModel代替拍卖。

您的查询将专门做一个投影来检索AuctionViewModel而不是拍卖。

+0

你能告诉我一个ViewModel应该如何看的例子吗?它将如何与部分视图配合使用? – Proximo

+0

@Proximo我已经更新了我的答案。 – scartag

+0

所以我必须为每个选项卡的每个属性创建一个ViewModel? :(当我讨厌打字时,我只显示了对象属性的缩写版本。 – Proximo

0

首先,当你调用局部视图,你需要设置Model属性是这样的:

@Html.Partial("_AuctionTab", Model) 

在另一方面,我建议你来定义,而不是与企业实体的ViewModels。它会给你更多的灵活性,而且你不需要制作依赖于拍卖的部分视图。另外,如果您被要求拥有计算值或不属于拍卖对象的属性,您可以轻松完成。您应该在控制器中构建ViewModel对象。

+2

父视图的模型默认传递给子部分,如果你没有传递任何东西..所以明确设置它不会超出清晰度... – scartag

+0

谢谢,我不知道这一点。 –