MVC5复杂对象形式

本文关键字:对象 复杂 MVC5 | 更新日期: 2023-09-27 18:02:23

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

Auction
 -[Property]
 -[Neighborhood]
 -[Agent]
 -source
 -clientId
 -reserve
Property
  -Street
  -City
  -State
  -Zip
Agent
  -Name
  -Email
  -Telephone
Neighborhood
  -Name
  -HOA Fee

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

标签是:拍卖,财产,代理,邻居

不幸的是,我被要求将其他对象的属性放在选项卡中。例如,Neighborhood选项卡会有Property. zip属性选项卡会有Auction.ClientId.

所以我所做的是为视图中的每个选项卡创建一个partial ..下面是一个简单的例子。

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

问题是,当我单击submit时,返回到Update操作的Auction除了第一部分的值外,大部分是空的。至于该怎么做,我有点像在碰壁。

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

谢谢!

MVC5复杂对象形式

模型绑定不能帮助您的导航属性,如Property, Agent等。

你可以用ViewModel来代替。

你的控制器将接受viewmodel作为参数,而不是Auction对象。

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

你的视图现在将使用@model AuctionViewModel而不是Auction。

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

首先,当你调用分部视图时,你需要像这样设置Model属性:

@Html.Partial("_AuctionTab", Model)

另一方面,我建议您定义ViewModels,而不是使用业务实体。它会给你更多的灵活性你不需要创建依赖于Auction的部分视图。此外,如果您被要求拥有一个不属于Auction对象的计算值或属性,您可以很容易地做到这一点。您应该在控制器中构建ViewModel对象。