【发布时间】:2010-12-02 19:00:58
【问题描述】:
我正在尝试掌握 MVC 框架的窍门,所以请耐心等待。
现在,我使用会话存储的唯一目的是存储当前登录的用户。我的网站很简单。对于此示例,请考虑三个域对象:Person、Meeting 和 File。用户可以登录并查看会议的“仅限成员”个人资料,并可以向其中添加文件,或者如果他们未登录,则可以查看会议的公开“个人资料”。
因此,从会议的私人资料中,我有一个登录用户,我有一个“添加文件”链接。此链接路由到 FileContoller.Add(int meetingId)。通过此操作,我得到了用户想要使用会议 ID 添加文件的会议,但是在发布表单后,我仍然需要知道用户正在向哪个会议添加文件。这就是我的问题所在,我应该通过 TempData 传递“当前正在与之交互”的会议,还是将其添加到 Session 存储中?
这是我目前设置添加操作的方式,但它不起作用:
public ActionResult Add(int meetingId)
{
try
{
var meeting = _meetingsRepository.GetById(meetingId);
ViewData.Model = meeting;
TempData[TempDataKeys.CurrentMeeting] = meeting; /* add to tempdata here */
}
catch (Exception)
{
TempData[TempDataKeys.ErrorMessage] = "Unable to add files to this meeting.";
return RedirectToRoute("MeetingsIndex");
}
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
var member = Session[SessionStateKeys.Member] as Member;
var meeting = TempData[TempDataKeys.CurrentMeeting] as Meeting; /* meeting ends up null here */
if (member == null)
{
TempData[TempDataKeys.ErrorMessage] = "You must be logged in to add files to an meeting.";
return RedirectToRoute("LoginPage");
}
if (meeting == null)
{
TempData[TempDataKeys.ErrorMessage] = "An error occurred. No meeting selected.";
return RedirectToRoute("MeetingsIndex");
}
// add files to meeting
TempData[TempDataKeys.Notification] = "Successfully added.";
return RedirectToRoute("AddFiles", new {meetingId = meeting.MeetingId});
}
编辑:
根据大多数答案,任何人都可以提供任何示例,说明应该在 TempData 与 Session 中存储哪种数据(消息除外)?
【问题讨论】:
-
TempDataKeys是什么类型,只是一个类?还是一个枚举?
-
@Anon343224user 现在为时已晚,但我正在为像你和我这样想知道的人写信。我也想知道,在github.com/Macht59/StenoCryptor/blob/master/… 找到了类似的用法,它是一个静态类,包含 consts 字符串字段。
-
现代读者请注意:TempData 在 .NET Core 中的工作方式与此处的许多答案中描述的方式不同。详情见我的回答here。
标签: asp.net-mvc session tempdata