0

私は人々がイベントに登録できるウェブサイトに取り組んでいます。登録ページには、データをキャプチャし、MVCコントローラーで検証し、ビュー間でデータを保持してから、プレビューページを表示するフォームがあります。

以下は私がやろうとしていることの簡単な例です。

Person ViewModel

    public class Person{
        public int TitleId {get; set;}
        public SelectList Titles {get; set;}
    }

コントローラーの登録

    public class RegisterController:Controller
    {
        [HttpGet]
        public ActionResult Register(){
            return View(new Person());
        }

        [HttpPost]
        public ActionResult Register(Person person){
            if(ModelState.IsValid){
                TempData["Person"] = person
                RepopulateSelectLists(); //Gets the data for the select list again
                return RedirectToAction("Preview");
            }
            return View();
        }

        [HttpGet]
        public Actionresult Preview(){
            Person person = (Person)TempData["Person"];

        }
    }

プレビュービュー

    @Html.DisplayFor(m => m.TitleId);  //Will display int, not selected value

SelectListにすべての値があり、前のページで選択した値のキー/ IDがあるとすると、選択したもののテキストだけを再表示するにはどうすればよいですか?

4

1 に答える 1

0

それはそのようには機能しません。Preview()ページで、指定されたIDを取得し、それに関連付けられた名前を見つけます。この場合、カスタムビューモデル(VM)を構築して、VMにIDと名前を保持することをお勧めします。

また、プレビューページでF5キーを押すと、すべてが終了します。TempDataは保持されず、ページを更新するとデータが失われます。

代わりに、ポストバックが成功したら、最初のポストデータに基づいて別のビューを返すことをお勧めします。例えば:

    [HttpPost]
    public ActionResult Register(Person person){
        if(ModelState.IsValid){
            RepopulateSelectLists(); //Gets the data for the select list again
            var previewVM = new PreviewVM();
            // populate it with the model or whatever else you need for the preview
            return View("Preview", previewVM);
        }
        return View();
    }

人のVMの例

public class Person { public int TitleId { get; set; } }
public class PersonVM : Person { public string TitleName { get; set; } }
// ... then in your Register method
var previewVM = new PersonVM { TitleId = person.TitleId, TitleName = GetTitle(person.TitleId) };

GetTitleがTitleIDに基づいてルックアップを実行すると仮定します。非常に粗いコードですが、要点を理解していただければ幸いです。使用するHtml.DisplayFor(m => m.Title); 場合プレビューに次のページへの投稿がある場合はHtml.HiddenFor(m => m.TitleId)、値が渡されることを確認する必要がありますが、現在の方法でもそれを行う必要があります。ViewBagまたは、タイトルを(またはViewData -- same thing) and simply not useDisplayForViewBag`に保存することもできto display the value and pass in the value from theます

"Preview"メソッドを完全に廃棄したことに注意してください。そうすれば、この時点でF5キーを押すと、プレビューページにアクセスするために使用したのと同じデータで再投稿されます。そして、あなたが保存していないと仮定すると(私はあなたがどこにいるのかわかりません)、投稿することに害はありません。わかる?

于 2012-11-09T22:28:22.147 に答える