2

つまり、フォームへの入力が正しいかどうかをチェックするコントローラーがあります。そうでない場合は、エラー メッセージを ViewBag に入れ、ビューを返します。このように(重要でないものは省きます):

var name = formCollection.Get(cr.Category.name + "-name-" + i).Trim();
var dateOfBirth = formCollection.Get(cr.Category.name + "-dateOfBirth-" + i).Trim();
var passportno= formCollection.Get(cr.Category.name + "-passportno-" + i).Trim();

if (name.Equals("") || dateOfBirth.Equals("") || passportno.Equals(""))
{
     ViewBag.ErrorMessage = "Please fill in all required fields at " + cr.Category.naam;
     return View("BulletinForm3");
}

そして、私のビューは次のようになります(重要でないものは省略されています):

<input name="@(cr.Category.naam)-name-@i" value="" />
<input name="@(cr.Category.naam)-dateOfBirth-@i" value="" />
<input name="@(cr.Category.naam)-passportno-@i" value="" />

@if (ViewBag.ErrorMessage != null)
{
     <p class="error">@ViewBag.ErrorMessage</p>
}

では、必須フィールドへの入力を忘れるとどうなりますか? ビューを返し、エラーメッセージを表示しますが、すでに入力されているすべてのフィールドが再び空になっています...だから私がしたいのは、ビューを返した後に FormCollection を使用してフィールドに入力し直すことです。次のように FormCollection を ViewBag に入れます。

ViewBag.ErrorMessage = "Please fill in all required fields at " + cr.Category.naam;
ViewBag.FormCollection = formCollection;
return View("BulletinForm3");

ビューでこれを変更しました:

<input name="@(cr.Category.naam)-name-@i" value="@if (ViewBag.FormCollection != null) { ((FormCollection)ViewBag.FormCollection).Get(cr.Category.naam + "-name-" + i);}" />

ただし、入力フィールドに FormCollection の値が入力されません... FormCollection は空ではなく (テスト済み)、名前は同じです (カウンター (i) は変更されません)。私は何を間違っていますか?

前もって感謝します

4

2 に答える 2

2

私はこれを循環的なものと考えています。

作成にビューを使用するとき、空のビュー モデルを送信します

return View("_CreateUserForm", new CreateUserViewModel());

HTML ヘルパーの "for" メソッドを使用してフォームを記述します。これにより、値 (またはデフォルト) がある場合にコントロールに入力されます。

@Html.CheckBoxFor(m => m.FindCriteria.TermsHaveBeenAccepted)
@Html.HiddenFor(m => m.MyHiddenValue)

ポストバック時に、mvc はフォームの値に基づいてモデルを自動的に設定します

ActionResult SaveNewUser(
  [Bind(Prefix = "")] CreateUserViewModel editUserViewModel)

(検証) エラーが発生した場合、このモデルをビューに送信すると、コントロールが入力されます

return View("_CreateUserForm", editUserViewModel);
于 2011-05-18T10:29:48.090 に答える
0

解決策が見つからなかったため、コントローラーで検証する代わりに Javascript 検証を使用することにしました。現在、ポストバックがないため、フィールドに再度入力する必要はありません。

于 2011-05-18T19:18:15.113 に答える