我正在一个允许人们注册活动的网站上工作。在注册页面上,我有一个表单,用于捕获数据,在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,我如何仅重新显示他们所选内容的文本?
答案 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,它只会使用您用于获取的相同数据重新发布到预览页面。假设你没有保存(我不知道你在哪里)那么回帖就没有坏处。有意义吗?