私はあなたが(と思う)で説明するものと一緒にサンプルを入れていると私はそれが仕事を得ることができるよ:
@model Test.Controllers.IFoo
<h2>Test</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>IFoo</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.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
:
public class TestController : Controller
{
public ActionResult Foo()
{
return View("IFoo");
}
[HttpPost]
public ActionResult Foo(Foo foo)
{
if (!ModelState.IsValid)
return View("IFoo", foo);
return RedirectToAction("Foo");
}
public ActionResult Bar()
{
return View("IFoo");
}
[HttpPost]
public ActionResult Bar(Bar bar)
{
if (!ModelState.IsValid)
return View("IFoo", bar);
return RedirectToAction("Bar");
}
}
// The Interface - the Required attributes are not
// on the interface, just the concrete classes
public interface IFoo
{
string Name { get; set; }
string Description { get; set; }
}
// Concrete Class 1 - Name is required
public class Foo : IFoo
{
[Required(ErrorMessage="Name is required.")]
public string Name { get; set; }
public string Description { get; set; }
}
// Concrete Class 2 - Description is required
public class Bar : IFoo
{
public string Name { get; set; }
[Required(ErrorMessage = "Description is required.")]
public string Description { get; set; }
}
が、私はその後、強く型付けされたビューを定義しました
/test/fooを参照して保存を押すと、名前に検証エラーが表示されます。
私が/ test/barを参照して保存を押すと、説明の検証エラーが表示されます。
あなたは正しいです。検証はサーバー側で行われます。しかし、jQueryクライアント側の検証はうまくいかず、簡単な解決策のようには見えないので、私はそれを答えとしてマークしています。 – Michael