在下一页上显示ASP.NET MVC SelectList的文本值

时间:2012-11-09 22:22:07

标签: c# asp.net-mvc

我正在一个允许人们注册活动的网站上工作。在注册页面上,我有一个表单,用于捕获数据,在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,我如何仅重新显示他们所选内容的文本?

1 个答案:

答案 0 :(得分: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 use DisplayFor to display the value and pass in the value from the ViewBag`

注意我完全废弃了"Preview"方法。这样,如果您此时点击F5,它只会使用您用于获取的相同数据重新发布到预览页面。假设你没有保存(我不知道你在哪里)那么回帖就没有坏处。有意义吗?