我正在使用AcceptVerbsScott Gu的Preview 5博客文章中详述的方法来处理ASP.NET MVC中的表单条目:
所以我没有必要使用TempData.也就是说,我现在必须在此过程中添加一个"确认"步骤,似乎需要使用TempData.
出于某种原因,我厌恶使用TempData- 它是一种可以设计的东西.
这是一个有效的问题,还是我在弥补?
我想有一个非常轻量级的ASP.NET MVC站点,其中包括尽可能多地删除常用的HttpModule并禁用会话状态.但是,当我尝试这样做时,我收到以下错误:
The SessionStateTempDataProvider requires SessionState to be enabled.
我在web.config中禁用了会话状态:
<sessionState mode="Off" />
Run Code Online (Sandbox Code Playgroud)
我知道ASP.NET MVC使用TempData的会话状态,但我不需要/想要TempData - 我只是想禁用会话状态.救命!
我正在使用ASP.NET MVC 3来构建Web应用程序.
我想要做的是在两个控制器之间传递值,虽然有很多方法可以做到这一点我特别感兴趣的是使用TempData它.
public ActionResult Action1()
{
string someMessage;
Test obj = SomeOperation();
if(obj.Valid)
{
someMessage = obj.UserName;
}
else
{
someMessage = obj.ModeratorName;
}
TempData["message"] = someMessage;
return RedirectToAction("Index");
}
public ActionResult Index()
{
ViewBag.Message = TempData["message"]
return View();
}
Run Code Online (Sandbox Code Playgroud)
那么TempData这里的使用是否正确?我的意思是在最好的编程实践中使用这种正确的方法TempData吗?
在什么时候应该TempData使用案例?
注意:我已经通过以下链接
谢谢
keep()和peek()有什么区别?
MSDN说:
marks the specified key in the dictionary for retention.returns an object that contains the element that is
associated with the specified key, without marking the key for
deletion.我无法得到真正的不同之处,难道他们都没有为另一个请求保留价值吗?
我试图搞清楚MVC框架,所以请耐心等待.
现在,我唯一使用会话存储的是存储当前登录的用户.我的网站很简单.对于此示例,请考虑三个域对象:Person,Meeting和File.用户可以登录并查看会议的"仅限会员"个人资料,并可以向其添加文件,或查看会议的公共"个人资料"(如果他们未登录).
因此,从会议的私人资料中,登录用户,我有一个"添加文件"链接.此链接路由到FileContoller.Add(int meetingId).通过此操作,我获得了用户希望使用会议ID添加文件的会议,但在发布表单后,我仍然需要知道用户正在向哪个会议添加文件.这就是我的问题所在,我应该通过TempData传递"当前正在与之交互"会议,还是将其添加到会话存储中?
这就是我目前的添加操作设置,但它不起作用:
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 …Run Code Online (Sandbox Code Playgroud) 我一直试图通过使用TempData重定向后将数据传递给一个动作,如下所示:
if (!ModelState.IsValid)
{
TempData["ErrorMessages"] = ModelState;
return RedirectToAction("Product", "ProductDetails", new { code = model.ProductCode });
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,它失败了以下消息:
"
System.InvalidOperationException的Microsoft.AspNet.Mvc.SessionStateTempDataProvider'不能序列类型的对象'ModelStateDictionary'到会话状态".
我在Github的MVC项目中发现了一个问题,但是虽然它解释了为什么我收到这个错误,但我看不出什么是可行的替代方案.
一种选择是将对象序列化为json字符串,然后将其反序列化并重新构建ModelState.这是最好的方法吗?我需要考虑哪些潜在的性能问题?
最后,是否有任何替代方法可以序列化复杂对象或使用其他不涉及使用的模式TempData?
我正在尝试创建自定义操作过滤器属性.还有一些地方,我需要设施,比如TempData [key]和TryUpdateModel ...我的自定义属性类派生自ActionFilterAttribute,我可以访问以下两种方法.
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,从两个filtercontext局部变量,我不知道如何访问TempData.我试图跟随几个线索,但没有成功.毕竟,也许filterContext变量中有TempData.在这种情况下,如何访问可用的TemData?
谢谢你的帮助
我使用的TempData是为了在使用时保留我的模型RedirectToAction.它工作正常,但我有一种唠叨的感觉,它可能不是正确的做法.我真的试图避免使用Session数据,我读过它TempData使用Session.使用安全吗?在负载平衡环境中使用它可能会出现问题吗?
琐事问题:"它安全吗?" - 为电影命名.
可以在控制器的操作中捕获我的异常吗?有没有更好的方法呢?我实际上是在控制器中捕获我的异常并使用TempData向用户显示消息,但我对这种方法有一种奇怪的感觉.我一直在浏览,但我找不到任何适合我的东西.
有人可以在MVC中解释TempData的用途.据我所知,它的行为与ViewBag相似,但除此之外还有什么作用.