2012-05-02 21 views
32

私は10 ajax.beginformを作成する以下のビューを持っていますが、私が直面している問題は、オブジェクトの作成中にエラーが発生した場合、ModelState私はModelState.AddModelErrorが私のビュー内に表示されていません

@model Medical.Models.VisitLabResult 

@for (int item = 0; item < 10; item++) 
{ 
    <tr id = @item> 
    @using (Ajax.BeginForm("CreateAll", "VisitLabResult", new AjaxOptions 
    { 
     HttpMethod = "Post", 
     UpdateTargetId = item.ToString() + "td", 
     InsertionMode = InsertionMode.Replace, 
     LoadingElementId = "progress2", 
     OnSuccess = string.Format(
      "disableform({0})", 
      Json.Encode(item)), 
    })) 
    { 
     @Html.ValidationSummary(true) 

     @Html.AntiForgeryToken() 
     <td> 
      @Html.DropDownList("LabTestID", String.Empty) 
      @Html.ValidationMessageFor(model => model.LabTestID) 
     </td> 
     <td> 
      @Html.EditorFor(model => model.Result) 
      @Html.ValidationMessageFor(model => model.Result) 
     </td> 

     <td> 
      @Html.EditorFor(model => model.DateTaken) 
      @Html.ValidationMessageFor(model => model.DateTaken) 
     </td> 

     <td> 
      @Html.EditorFor(model => model.Comment) 
      @Html.ValidationMessageFor(model => model.Comment) 
     </td> 

     <td> 
      <input type="submit" value="Create" /> 
     </td> 

     <td id = @(item.ToString() + "td")> 
     </td> 
    } 
    </tr> 
    } 
</table> 

そしてModelState.AddModelErrorを定義して、私のアクションメソッドに従うようビューが見えます@Html.ValidationSummary(true) 設定しているが.AddModelErrorがビューに表示されなくなりますが、次のようになります -

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult CreateAll(VisitLabResult vlr, int visitid = 28) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var v = repository.GetVisit(visitid); 
      if (!(v.EligableToStart(User.Identity.Name))){ 
       return View("NotFound"); 
      } 
      vlr.VisitID = visitid; 
      repository.AddVisitLabResult(vlr); 
      repository.Save(); 

      return Content("Addedd Succsfully"); 
     } 
    } 
    catch (DbUpdateException) 
    { 
     JsonRequestBehavior.AllowGet); 
     ModelState.AddModelError(string.Empty, "The Same test Type might have been already created,, go back to the Visit page to see the avilalbe Lab Tests"); 
    } 
} 

私のビューにModelState.AddModelErrorを表示するにはどうすればいいですか?そこに与えられたID のための訪問を存在している場合

答えて

57


私はあなたのtry{ } catch(){ }

そして、最初のチェックを変更するには、あなたを促すだろうので、単純に加算モデル誤差

if (visitExists) 
    { 
     ModelState.AddModelError("CustomError", "The Same test Type might have been already created,, go back to the Visit page to see the avilalbe Lab Tests"); 
     return View(vlr);  
    } 
    //Other code here 
でモデルを返す場合

AddModelErrorをToに変更する

ModelState.AddModelError("CustomError", "The Same test Type might have been already created,, go back to the Visit page to see the avilalbe Lab Tests"); 

そして、あなたは、エラーが表示されますあなたのモデルを返すときに、@ Html.ValidationMessage ...

+0

はどのようにして、エラーメッセージをラップするHTMLを扱うのでしょうか?エラーが発生した場合にのみ、HTML(ブートストラップアラートなど)を表示します。 – Ciwan

8

@Html.ValidationSummary(true) を置いた場所、あなたのビューで、単にその後

@Html.ValidationMessage("CustomError") 

を追加するには、およそのみエラーメッセージを表示しますあなたはまた、追加メッセージを表示したい場合は、モデルのpropertysは、あなたがDISに必要がある場合は @Html.ValidationSummary(false) を設定する必要が

ModelState.AddModelError(
    "CustomError", 
    "The Same test Type might have been already created, go back to the Visit page to see the avilalbe Lab Tests"); 

を追加しました入力フィールドの近くで確認メッセージを再生し、@Html.ValidationSummary(true)を設定し、Syneryxの推奨手順に従います

5

ModelStateにアクセスするには、ViewData辞書から利用できます。アクションで

ModelState.AddModelError("CustomError", "Error 1"); 
ModelState.AddModelError("CustomError", "Error 2"); 

と "エラー1" のメッセージを取得する:たとえば

ViewData.ModelState["CustomError"].Errors[0].ErrorMessage 
関連する問題