C# MVC5复杂对象形式

C# MVC5复杂对象形式,c#,asp.net-mvc,forms,razor,viewmodel,C#,Asp.net Mvc,Forms,Razor,Viewmodel,我正在创建一个拍卖。拍卖对象有许多作为财产的对象,例如: Auction -[Property] -[Neighborhood] -[Agent] -source -clientId -reserve Property -Street -City -State -Zip Agent -Name -Email -Telephone Neighborhood -Name -HOA Fee 所以基本上我必须创建一个多选项卡视图来更新拍卖对象 Publ

我正在创建一个拍卖。拍卖对象有许多作为财产的对象,例如:

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

Property
  -Street
  -City
  -State
  -Zip
Agent
  -Name
  -Email
  -Telephone
Neighborhood
  -Name
  -HOA Fee
所以基本上我必须创建一个多选项卡视图来更新拍卖对象

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

}
标签包括:拍卖、财产、代理、邻居

不幸的是,我被要求将其他对象的属性放在选项卡中。例如,邻居选项卡将具有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>
}
@模型拍卖
@使用(Html.BeginForm(“更新”,“拍卖”,HttpMethod.Post,new{})
{
@Html.Partial(“\u AuctionTab”)
@Html.Partial(“_PropertyTab”)
@Html.Partial(“\u AgentTab”)
@Html.Partial(“\u邻居选项卡”)
提交
}
各方都在使用拍卖模式

以下是\u 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/>
@模型拍卖
@Html.LabelFor(m=>m.ClientId)
@Html.EditorFor(m=>m.ClientId)

@Html.LabelFor(m=>m.Property.Street)
@Html.EditorFor(m=>m.Property.Street)

@Html.LabelFor(m=>m.Property.City)
@Html.EditorFor(m=>m.Property.City)

@LabelFor(m=>m.Property.State)
@Html.EditorFor(m=>m.Property.State)

@Html.LabelFor(m=>m.Property.Zip)
@Html.EditorFor(m=>m.Property.Zip)

@Html.LabelFor(m=>m.Property.Street)
@Html.EditorFor(m=>m.Property.Street)

问题是,当我单击submit时,返回到更新操作的拍卖除了第一部分的值外,大部分都是空的

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


谢谢!

模型绑定对属性、代理等导航属性没有帮助

您可以使用ViewModel来实现这一点

控制器将以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)

另一方面,我建议您定义ViewModels,而不是使用业务实体。这将给您带来更大的灵活性,您不需要创建依赖于拍卖的局部视图。此外,如果要求您提供计算值或不属于拍卖对象的财产,您可以轻松完成。您应该在控制器中构建ViewModel对象。

您能给我举个例子说明ViewModel的外观吗?以及它如何与局部视图相结合?因此我必须为每个选项卡创建一个具有每个属性的ViewModel吗(Dang我讨厌键入,我只显示了对象属性的缩写版本。@Proximo不是每个人都有一个属性..只是你关心的那些..它是一个视图模型..因此所有这些都是视图所需的属性。感谢你的帮助。如果你你什么都不通过,所以显式设置除了清晰之外没有什么作用…谢谢,我不知道。