子オブジェクトとして部分的なViewModelを持つViewModelの部分的なビューの一部を検証する方法を理解できないようです。これが私の最低レベルの部分です。これは常に他のフォームタグ内の部分的なビューとして消費されます。
namespace MVC3App.ViewModels
{
public class Payment : IValidatableObject
{
public decimal Amount { get; set; }
public int CreditCardNumber { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Amount < 20)
yield return new ValidationResult("Please pay more than $20", new string[] { "Amount" });
}
}
}
そして、これがそれを含む「メイン」ViewModelです:
namespace MVC3App.ViewModels
{
public class NewCustomerWithPayment :IValidatableObject
{
public string Name { get; set; }
public int Age { get; set; }
public ViewModels.Payment PaymentInfo { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Age < 18)
yield return new ValidationResult("Too young.", new string[] { "Age" });
}
}
}
NewCustomerWithPaymentのビューについては、次のようになります。
@model MVC3App.ViewModels.NewCustomerWithPayment
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>NewCustomerWithPayment</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Age)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Age)
@Html.ValidationMessageFor(model => model.Age)
</div>
</fieldset>
@Html.Partial("Payment")
<p><input type="submit" value="Create" /></p>
}
また、部分ビューの「支払い」は常に別のHtml.Beginformタグ内にレンダリングされ、次のようになります。
@model MVC3App.ViewModels.Payment
<h2>Payment</h2>
<fieldset>
<legend>Payment</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Amount)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Amount)
@Html.ValidationMessageFor(model => model.Amount)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.CreditCardNumber)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.CreditCardNumber)
@Html.ValidationMessageFor(model => model.CreditCardNumber)
</div>
</fieldset>
私の問題は、「支払い」ビューモデルの検証を機能させることができないことです。部分ビューとしてレンダリングされるViewModelsでIValidatableObjectを使用した経験のある人は、チャイムを鳴らして、機能する検証パターンを教えてくれますか?必要に応じて、JavaScriptの検証なしで生活できます。