私は、MVC 3 for のカップルの質問にフールプルーフを使用しています。具体的には、テキストエリア付きのラジオボタンがあります。ラジオボタン「はい」が選択されている場合、テキストエリアを空にすることはできません。通常の 'Required' 属性を使用していくつかのフィールドで他の検証を行い、それらは正常に機能しますが、'RequiredIfTrue' 属性はクライアント側で検証されません。したがって、すべてのフィールドに入力して検証し、ラジオで [はい] をクリックして対応するテキストエリアを空のままにしてから送信すると、フォームはクライアント側を検証する代わりにサーバーにヒットします。また、ブラウザーでソースを表示すると、フォームが送信されるまで「RequiredIfTrue」属性が HTML に追加されないことに気付きました。
このプロジェクトにViewModelを使用していますが、それが問題のようです。現在、属性はモデル内のプロパティにあり、ViewModel でそのモデルを参照し、ViewModel をビューに渡します。しかし、プロパティを ViewModel に直接配置すると、正しく機能します。プロパティが正しいモデル/テーブルに関連付けられるように、ある種のマッピング コードを ViewModel に追加する必要がないので、 ViewModel のプロパティは必要ありません。
プロジェクトに含まれるスクリプトは次のとおりです。
<link href="@Url.Content("~/Content/mvc.css")" rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/jquery-ui-1.8.22.custom.css")" rel="Stylesheet"" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.22.custom.min.js")" type="text/javascript""></script>
<script src="@Url.Content("~/Scripts/HistoryArrayTables.js")" type="text/javascript""></script>
<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>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/mvcfoolproof.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MvcFoolproofJQueryValidation.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MvcFoolproofValidation.min.js")" type="text/javascript"></script>
モデルの一部を次に示します。
using Foolproof;
namespace EligibityForm.Models
{
[MetadataType (typeof(HistoryMetadata))]
public partial class History
{
}
public class HistoryMetadata
{
[StringLength(2000)]
[RequiredIfTrue("HasComment", ErrorMessage="Please enter an explanation")]
[Display(Name = "Have you EVER been subject to a lawsuit?")]
public string Comment { get; set; }
public bool HasComment { get; set; }
}
そして、ここに ViewModel の一部があります:
using Foolproof;
namespace EligibityForm.Models.CompositeModels
{
public class HistoryViewModel
{
public History HistoryModel { get; set; }
ありがとう。