MVC5复杂对象形式

时间:2015-07-12 19:41:32

标签: c# asp.net-mvc forms razor viewmodel

我正在拍卖。 Auction对象有很多对象作为属性,例如:

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

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

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

标签是:拍卖,物业,代理,邻居

不幸的是,我被要求在选项卡中放置其他Object的属性。例如,邻居选项卡将具有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/>

问题在于,当我单击提交时,除了第一个部分的值之外,返回到Update操作的Auction大部分都是null。就我该做什么而言,我有点撞到墙上。

基本上,提交按钮必须保存整个拍卖。这里有什么方法和最佳实践建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

模型绑定不能帮助您获取属性,代理等导航属性。

您可以使用ViewModel来实现此目的。

您的Controller会将viewmodel作为参数而不是Auction对象。

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

}

您的视图现在将使用@model AuctionViewModel代替拍卖。

您的查询将专门执行投影以检索AuctionViewModel而不是拍卖。

答案 1 :(得分:0)

首先,当您调用局部视图时,需要像下面这样设置Model属性:

@Html.Partial("_AuctionTab", Model)

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