2012-02-10 10 views
1

私のビューにはフォームがあります。フォームのフィールドはモデルから派生しています。 ここでコードを短縮するための変数を1つだけ指定しました。フォームのサーバー側mvc3検証が機能しない

MODEL: 
public class abc 
{ 
    [Required] 
    public string name { get; set; } 
} 

VIEW: 
<body onload="SetButton()"> 
@using (Html.BeginForm("myaction","mycontroller",FormMethod.POST, new {id="myform"})) 
{ 
    @Html.TextBoxFor(m=>m.name) 
    @Html.ValidationMessageFor(m=>m.name) 
} 
</body> 
<script type="text/javascript"> 
function SetButton{ 
    document.getElementById("button").innerHTML='<input type="submit" value="Next"    style="width:90px" onclick="myform.submit()"/>'; 
} 
</script> 

Layout Page: 
<div id="button"></div> 

[次へ]ボタンをクリックすると、検証は行われません。フォームは「名前」フィールドに何も入力されていなくても送信されます。ボタンがフォーム(myform)の中に置かれていると、検証作業が行われます。

答えて

2

送信ボタンがフォームの外にあります。これは不可能です。送信ボタンは、対応する<form>要素内に配置する必要があります。したがって、<div id="button"></div>をフォーム内に移動する必要があります。

何らかの理由でdivがフォーム外にある(意味的に間違っている)場合は、javascriptを使用する必要があります。この場合は、送信ボタンではなく通常のボタンを使用できます。

htmlフォームのもう1つの重要な側面は、がネストされていないことです。したがって、レイアウト内に別のフォームがある場合は、ビュー内にネストされたフォームを配置することはできません。これは無効なHTMLであり、予期しない動作が発生します。

限り、サーバー側の検証に関しては、あなたがあなたのフォームを投稿しているコントローラのアクションは、アクションの引数として、あなたのビューモデルを取ることを確認してください。

[HttpPost] 
public ActionResult MyAction(abc model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 

    ... 
} 
+0

私は、ネストされたフォームを持っていません。実際、ボタンは複数の画面に共通するフッターの一部なので、レイアウトページ内のフォームの外に置くことにしました。 「提出」タイプを「ボタン」に変更しても機能しませんでした。ボタンを外に保ち、検証を行う方法はありますか? –

+0

@ karank、はい、可能です。送信タイプの代わりにボタンタイプを使用し、コントローラーアクションでアクションモデルとしてビューモデルを取得する必要があります。ビューモデルが適切な検証属性で修飾されている場合は、エラーメッセージが自動的にModelStateに追加されます。 –