【问题标题】:MVC5 Complex Object FormMVC5 复杂对象形式
【发布时间】:2015-07-12 19:41:32
【问题描述】:

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

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

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

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

选项卡是:拍卖、财产、代理、社区

不幸的是,我被要求将其他对象的属性放在选项卡中。例如,Neighborhood 选项卡将具有 Property.Zip,Property 选项卡将具有 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/>

问题是,当我点击提交时,除了第一个部分的值之外,返回到更新操作的拍卖大部分为空。至于该怎么做,我有点想把头撞到墙上。

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    您的控制器会将视图模型作为参数而不是拍卖对象。

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

    您的视图现在将使用@model AuctionViewModel 而不是拍卖。

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

    【讨论】:

    • 你能给我看一个 ViewModel 应该是什么样子的例子吗?它将如何与部分视图联系起来?
    • 所以我必须为每个选项卡创建一个包含每个属性的 ViewModel? :(当我讨厌打字,我只显示了对象属性的缩写版本。
    • @Proximo 不是每个人都拥有单一属性 .. 只是你关心的那些 .. 它是一个视图模型 .. 所以所有应该存在的都是视图所需的属性。
    • 感谢您的帮助。
    【解决方案2】:

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

    @Html.Partial("_AuctionTab", Model)
    

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

    【讨论】:

    • 如果你不传递任何东西,父视图的模型默认传递给子部分......所以明确地设置它并没有做太多的事情......
    • 谢谢,我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2017-08-02
    • 2016-09-25
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    相关资源
    最近更新 更多