MVC5复杂对象表单
我正在创建拍卖。拍卖对象有很多对象作为属性,如: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/>
的问题是,当我点击提交,拍卖返回更新动作大多是空除了第一部分的值。在这里,我的头撞在墙上,直到做什么。
基本上提交按钮必须保存整个拍卖。任何关于方法和最佳实践的建议?
谢谢!
模型结合并没有帮助你像物业,代理等
导航性能,您可以使用一个ViewModel,而不是实现这一目标。
而您的控制器会将viewmodel作为参数而不是拍卖对象。
Public class AuctionViewModel
{
public int ClientId {get; set;}
public string Street {get; set;}
//the rest of them.
}
您的看法现在使用@model AuctionViewModel
代替拍卖。
您的查询将专门做一个投影来检索AuctionViewModel
而不是拍卖。
首先,当你调用局部视图,你需要设置Model属性是这样的:
@Html.Partial("_AuctionTab", Model)
在另一方面,我建议你来定义,而不是与企业实体的ViewModels。它会给你更多的灵活性,而且你不需要制作依赖于拍卖的部分视图。另外,如果您被要求拥有计算值或不属于拍卖对象的属性,您可以轻松完成。您应该在控制器中构建ViewModel对象。
父视图的模型默认传递给子部分,如果你没有传递任何东西..所以明确设置它不会超出清晰度... – scartag
谢谢,我不知道这一点。 –
你能告诉我一个ViewModel应该如何看的例子吗?它将如何与部分视图配合使用? – Proximo
@Proximo我已经更新了我的答案。 – scartag
所以我必须为每个选项卡的每个属性创建一个ViewModel? :(当我讨厌打字时,我只显示了对象属性的缩写版本。 – Proximo