如何从Session获取当前用户ID填充CreatedBy与UpdatedBy字段
解决方案
嘿,我来帮你搞定这个问题!要从Session里取当前用户ID填充CreatedBy和UpdatedBy字段,其实操作起来很简单,咱们一步步来:
1. 在QuestionAnswer控制器中编写插入逻辑
首先,你需要在QuestionAnswerController里新增一个处理表单提交的POST方法,在这里完成从Session取数、实体赋值和数据插入的操作:
[HttpPost] public ActionResult SubmitAnswer(QuestionAnswer model) { // 先验证表单数据是否符合实体的注解规则(比如Question_Answer的长度要求) if (ModelState.IsValid) { // 从Session中获取当前登录用户的ID,注意要转换为int类型 if (Session["UserId"] != null) { int currentUserId = Convert.ToInt32(Session["UserId"]); // 给实体的CreatedBy和UpdatedBy赋值 model.CreatedBy = currentUserId; model.UpdatedBy = currentUserId; // 同时设置创建和更新时间为当前服务器时间,避免前端传值的误差 model.CreatedDateTime = DateTime.Now; model.UpdatedDateTime = DateTime.Now; // 可以在这里设置其他默认字段值,比如IsMarkedAsAnswer默认未标记,Score初始为0 model.IsMarkedAsAnswer = false; model.Score = 0; // 调用你的数据访问层(比如StackProvider)完成数据插入 StackProvider provider = new StackProvider(); provider.InsertQuestionAnswer(model); // 插入成功后跳转到首页或者对应的问题详情页 return RedirectToAction("Homepage"); } else { // 如果Session中没有UserId,说明用户未登录,跳转到登录页面 return RedirectToAction("Login", "Account"); } } // 如果表单验证失败,返回原页面并显示错误提示 return View(model); }
2. 确保视图表单正确绑定字段
你的页面里的文本框要正确绑定到Question_Answer字段,同时别忘了隐藏字段传递QuestionId(因为这个字段是关联问题的,通常从路由或者ViewBag获取):
@model QuestionAnswer @using (Html.BeginForm("SubmitAnswer", "QuestionAnswer", FormMethod.Post)) { <div class="form-group"> @Html.LabelFor(m => m.Question_Answer) @Html.TextAreaFor(m => m.Question_Answer, new { @class = "form-control", rows = 6 }) @Html.ValidationMessageFor(m => m.Question_Answer, "", new { @class = "text-danger" }) </div> <!-- 隐藏字段传递QuestionId,这里假设QuestionId是从ViewBag传过来的 --> @Html.HiddenFor(m => m.QuestionId, new { Value = ViewBag.QuestionId }) <button type="submit" class="btn btn-primary">提交回答</button> }
3. 额外的优化建议
- 为了避免重复代码,你可以封装一个工具方法,专门用来从Session获取当前用户ID,比如写一个
GetCurrentUserId()的扩展方法,这样多个控制器都能复用。 - 如果你后续打算切换到ASP.NET Identity认证,也可以改用
User.Identity.GetUserId()来获取用户ID,但目前你的Session方案完全适用。 - 一定要检查Session是否存在
UserId,防止未登录用户提交数据,保证数据的安全性。
内容的提问来源于stack exchange,提问作者RAJESHKUMAR M
相关产品推荐
相关产品推荐

