0

我认为通过显示一些代码并进行解释可能更容易解释:

创建产品视图模型:

[UIHint("Prices")]
public IList<CreatePricesViewModel> Prices { get; set; }

有了这个,我希望能够使用 ajax 调用为产品添加另一组不同货币的价格。

创建价格 ViewModel:

[DataType(DataType.Currency)]
[DisplayName("Wholesale Price: ")]
public decimal Wholesale { get; set; }

[DataType(DataType.Currency)]
[Required]
[DisplayName("Retail Price: ")]
public decimal Retail { get; set; }

[DataType(DataType.Currency)]
[DisplayName("Discounted Price: ")]
public decimal Discount { get; set; }

在我的控制器中,我创建了一个 CreatePricesViewModel 并将其添加到 CreatePricesViewModel 的 CreateProductViewModels 列表中,因此至少有一个可用的实例可以在视图中呈现。

创建产品视图:

@model CumbriaMD.Infrastructure.ViewModels.ProductViewModels.CreateProductViewModel 
......
<div class="editor-field">
    @Html.EditorFor(model => model.Prices)
    @Html.ValidationMessageFor(model => model.Prices)
</div>

价格编辑器模板:

这是我真正挣扎的地方。当我对 CreatePricesViewModel 进行强类型输入时,我会收到投诉,因为我传入的是 CreatePricesViewModel 类型的 IEnumerable 而不是单个实例 - 但是当我使用 foreach 循环时,我的 id 和名称被弄乱了,所以模型绑定失败了?可以在这里使用@inherits 帮助吗?

@model CumbriaMD.Infrastructure.ViewModels.PriceViewModels.CreatePricesViewModel

<div class="editor-label">
   @Html.LabelFor(model => model.Wholesale)
</div>
<div class="editor-field">
   @Html.EditorFor(model => model.Wholesale)
   @Html.ValidationMessageFor(model => model.Wholesale)
</div>
<div class="editor-label">
   @Html.LabelFor(model => model.Retail)
</div>
<div class="editor-field">
  @Html.EditorFor(model => model.Retail)
  @Html.ValidationMessageFor(model => model.Retail)
</div>
<div class="editor-label">
  @Html.LabelFor(model => model.Discount)
</div>   
<div class="editor-field">
  @Html.EditorFor(model => model.Discount)
  @Html.ValidationMessageFor(model => model.Discount)
</div>  
4

1 回答 1

1

不,@inherits不能解决你的头痛。

使用时UIHint,会传递整个枚举,因此您需要将模板强类型化到列表中:

@model IEnumerable<CumbriaMD.Infrastructure.ViewModels.PriceViewModels.CreatePricesViewModel>
@foreach(var item in Model)
{
    @Html.Partial("_SomePrice", item)
}

然后定义_SomePrice.cshtml部分:

@model CumbriaMD.Infrastructure.ViewModels.PriceViewModels.CreatePricesViewModel

<div class="editor-label">
   @Html.LabelFor(model => model.Wholesale)
</div>
<div class="editor-field">
   @Html.EditorFor(model => model.Wholesale)
   @Html.ValidationMessageFor(model => model.Wholesale)
</div>
<div class="editor-label">
   @Html.LabelFor(model => model.Retail)
</div>
<div class="editor-field">
  @Html.EditorFor(model => model.Retail)
  @Html.ValidationMessageFor(model => model.Retail)
</div>
<div class="editor-label">
  @Html.LabelFor(model => model.Discount)
</div>   
<div class="editor-field">
  @Html.EditorFor(model => model.Discount)
  @Html.ValidationMessageFor(model => model.Discount)
</div>  

当您不使用 UIHint 属性时,这不是必需的 => 将为 Prices 集合的每个元素自动调用编辑器模板。这很糟糕,但就是这样。

于 2012-08-20T16:17:38.830 回答