編集回答の際
再読み込みしたばかりの値が選択されているかどうかを知りたいようなあなたの質問を、それが聞こえます。その場合はその後、ちょうどRequiredAttribute
からGuid
プロパティを適用し、(@model GuidModel
に)強く型付けされたビューで
public class GuidModel
{
[Required]
public Guid? Guid { get; set; }
public IEnumerable<Guid> Guids { get; set; }
}
そのモデルに、それはNULL可能にする
@Html.ValidationMessageFor(m => m.Guid)
@Html.DropDownListFor(
m => m.Guid,
Model.Guids.Select(g => new SelectListItem {Text = g.ToString(), Value = g.ToString()}),
"-- Select Guid --")
クライアント検証JavaScriptスクリプトを追加します。クライアント側の検証のための参照。
コントローラは、これはGuid
プロパティはモデル結合GuidModel
のために必要であることを保証します
public class GuidsController : Controller
{
public GuidRepository GuidRepo { get; private set; }
public GuidsController(GuidRepository guidRepo)
{
GuidRepo = guidRepo;
}
[HttpGet]
public ActionResult Edit(int id)
{
var guid = GuidRepo.GetForId(id);
var guids - GuidRepo.All();
return View(new GuidModel { Guid = guid, Guids = guids });
}
[HttpPost]
public ActionResult Edit(GuidModel model)
{
if (!ModelState.IsValid)
{
model.Guids = GuidRepo.All();
return View(model);
}
/* update db */
return RedirectToAction("Edit");
}
}
のように見えます。
オリジナル回答
私はこれを行うことが可能である既製のデータ注釈検証属性があることを信じていません。私はa blog post about one way to achieve thisと書いた。ポストはIoCコンテナを使用していますが、何か動作したい場合はハードコーディングされた依存関係を取ることができます。
public class ValidGuidAttribute : ValidationAttribute
{
private const string DefaultErrorMessage = "'{0}' does not contain a valid guid";
public ValidGuidAttribute() : base(DefaultErrorMessage)
{
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var input = Convert.ToString(value, CultureInfo.CurrentCulture);
// let the Required attribute take care of this validation
if (string.IsNullOrWhiteSpace(input))
{
return null;
}
// get all of your guids (assume a repo is being used)
var guids = new GuidRepository().AllGuids();
Guid guid;
if (!Guid.TryParse(input, out guid))
{
// not a validstring representation of a guid
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
// is the passed guid one we know about?
return guids.Any(g => g == guid) ?
new ValidationResult(FormatErrorMessage(validationContext.DisplayName)) : null;
}
}
して、モデルのような
何かが、あなたはこれがあなたに、サーバー側の検証を与えるコントローラのアクション
public class GuidModel
{
[ValidGuid]
public Guid guid { get; set; }
}
に送ります。 RemoteAttribute
を使用して、これを行うクライアント側の検証を記述することもできますが、このクライアント側の検証を見ようとしている唯一の人は、 DOM;あなたの普通のユーザーには何のメリットもありません。
Guidプロパティにnullableとマークしない限り、実際には機能しません。私の答えを参照してください。 –
@NickAlbrechtありがとう、 –