2009-08-20 14 views
1

このコードでは、Editビューで正しいベンダー名のテキストが表示されますが、テキストボックスを空白にして[保存]を押すと、検証されません。 VendorはOrderモデルのプロパティで、VendorNameはVendorモデルのプロパティです。彼らは参照に関連している。私のフォームはすべて1つのテーブルに入力されるわけではなく、サテライトテーブルにも入力されます。ASP.Net MvCフレームワーク、Html.ValidationMessageタグ

<%= Html.TextBox("Vendor.VendorName")%> 
<%= Html.ValidationMessage("Vendor.VendorName")%> 

なぜ検証が行われないのですか?

これが動作しているようですが、それは私にはハックのように思える:

using M = HelloUranus.Models 
//... 
    namespace HelloUranus.Controllers 
    { 

    public class OrderDetailController : Controller 
    { 
     //... 

     private M.DBProxy db = new M.DBProxy(); 

     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Edit(int id, FormCollection collection) 
     { 

     //... 
     var orderDetail = db.GetOrderDetail(id); 
     //... 

     try 
     { 

      if (string.IsNullOrEmpty(Request.Form["Vendor.VendorName"])) 
      { 
      throw new Exception(); 
      } 

      UpdateModel(orderDetail); 

      db.Save(); 

      return RedirectToAction("Details", new {id = orderDetail.odID }); 
     } 

     catch 
     { 
      ModelState.AddRuleViolations(orderDetail.GetRuleViolations()); 

      return View(orderDetail); 
     } 
     //... 
     } 
     //... 
    } 

答えて

2

あなたは、任意の検証コードを書きましたか?コントローラで手動で検証する必要があります。たとえば、コントローラ内の

ModelState.IsValid = false; 

の場合、いくつかの検証が表示されます。これにより、表示されるビューのValidationSummaryがトリガーされます。

ModelState.AddModelError("Vendor.VendorName", string.Format("Vendor name must be at least {0} characters.",10)); 

注これはまた、無効状態ににModelStateを設定し、したがって、同様のValidationSummaryをトリガすること:実際に、単一のフォーム要素、使用に検証を追加します。

+1

ModelState.AddModelErrorは、自動的にIsValidをfalseに設定します。 –

+0

あなたは正しい、私の間違い。私はあなたが*何かを覚えていなければならないことを知っていましたが、何かが、ModelStateDictionaryをSetModelValueを使って無効なデータでフォームを再作成するように設定しています。 Lemmeはそれを編集する。 – JoshJordan

+0

ワークフローでは、ModelState.AddModelError( "Vendor.VendorName"、 "*")を実行しますか? edit-postアクションメソッドのSave部分のtryセクションで完了した場合、ModelState.IsValidはfalseになるので、例外がスローされます。 – JonathanWolfson

関連する問題