1

asp.net mvc3 で ADO.Net エンティティ フレームワークを使用しています。データベースが最初のモデルがあります。後で説明するように、データの検証が機能しない場合があります。

私はフォームを持っています。そのフォームを送信すると、一部のアイテムは検証されていますが、他のアイテムは検証されていません。私は単にこのようなフォームを使用しています。

    @using (Html.BeginForm()) {
    @Html.ValidationSummary(true)


   <fieldset>
        <legend></legend>


         <div class="editor-label">
            @Html.LabelFor(model => model.VERSION_ID)
            @Html.EditorFor(model => model.VERSION_ID)
            @Html.ValidationMessageFor(model => model.VERSION_ID)
        </div>

        <div class="editor-field">
            @Html.LabelFor(model => model.ENTITY2.Name)
            @Html.EditorFor(model => model.ENTITY2.Name)
            @Html.ValidationMessageFor(model => model.ENTITY2.Name)
        </div>
    <p>
        <input type="submit" value="Create" />
    </p>

現在、version_id の検証は機能していますが、Name は機能していません。別のエンティティから名前を取得しています。検証が機能しない理由についてのアイデアはありますか? そのフィールドが必須であるため許可されるべきではない空のフィールドを入力できますが、送信を押すとエラーが発生します。

4

1 に答える 1

3

Model クラスは空の値を許可していると思います。

ビューでモデル クラスを直接使用することは避け、そのために別のビューモデル (POCO クラス) を作成します。ViewModel には、ビューが必要とする関連プロパティのみを含める必要があります。ほとんどの場合、ドメイン モデルのすべてのプロパティではありません。ViewModelでデータ注釈を使用できます(必須属性など...)

public class VersionViewModel
{
  [Required]
  public string VersionID { set;get;}

  [Required]
  public string Name { set;get;}
}

あなたのビューは、このビューモデルに強く型付けされます。アクション メソッドにポストバックされたら、ViewModel の値をドメイン モデルにマップして保存します。

[HttpPost]
public ActionResult Edit(VersionViewModel model)
{
  if(ModelState.IsValid)
  {
     //validation is ok. Let's save
    var domainModel=new Version();
    domainModel.VERSION_ID=model.VersionID ;
    domainModel.Name=model.Name;

    //Let's save and REdirect 
    yourRepositary.SaveVersion(domainModel);
    return RedirectToAction("Saved",new { id=model.ID});     
  }
  return View(model);
}

手動でマッピングする代わりに、AutoMapperなどのライブラリを使用することを検討してください。

于 2012-10-05T20:27:12.507 に答える