0

我正在开发一个允许人们注册活动的网站。在注册页面上,我有一个捕获数据的表单,在 MVC 控制器中进行验证,在视图之间保留它,然后应该显示一个预览页面。

下面是我正在尝试做的一个简化示例。

人视图模型

    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),以将 ID 和名称保留在 VM 中。

此外,在预览页面上按 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 useDisplayFor to display the value and pass in the value from theViewBag`

请注意,我完全废弃了该"Preview"方法。这样,如果您此时按 F5,它只会使用您用于访问预览页面的相同数据重新发布。并且假设您没有保存(我看不到您在哪里),那么回发也没有什么坏处。有道理?

于 2012-11-09T22:28:22.147 回答