action里加:ViewBag.HiddenField = new MvcHtmlString("<input type='hidden' value='xxx' id='xxx' />");
视图里:@ViewBag.HiddenField
谢谢你的回答。不过你没有看明白我的问题。
解决了我的问题!MVC下页面刷新保存数据
ActionFilterAttribute不是干这个用的,你非要这么用说明设计有问题。这个例子可以帮你做到你要的效果,但是看起来怪怪的。
//the action
[MyFilter]
public ActionResult Test(string id)
{
ViewBag.MyValue = HttpContext.Items["MY_HIDDEN_VALUE"] ?? "";
return View();
}
//the filter
public class MyFilterAttribute : FilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Items["MY_HIDDEN_VALUE"] = "test";
base.OnActionExecuting(filterContext);
}
}
//the View
<input type="hidden" value="<%: ViewBag.MyValue %>" />
我想实现的是建一个Controller的基类。在基类里面实现所有页面的二次提交check.而不需要各个Action做任何事情,更不需要在View中定义任何东西。当然controller要继承这个基类。只使用Session也是可以实现的,我现在考虑的是使用页面提交的hidden值和Session结合来实现。
所以我打算使用OnActionExecuting或者和OnActionExecuted(只使用Session控制)结合来做。不知道我这么设计有什么问题,或者你有什么好的方案。
还有OnActionExecuting在Controller里面也有虚方法提供重载,不是一定要使用filter才可以利用这个方法的。
@刘鸿海: 你需要check什么?业务逻辑还是基本输入逻辑?
@水牛刀刀: check2次提交啊。就是不允许用户在提交第一次后响应还没有回来之前,再提交一次。
@刘鸿海: 这种都是客户端做的啊。比如,提交后响应回来之前,提交按钮是禁用的。(你可能会说这个检查不靠谱) 但是页面检查也不靠谱的,比如,用户可以打开多个未提交的页面,然后疯狂提交……其实你只要保证服务器端是正确的就好了,你把提交按钮禁用掉,让用户不能多次提交,如果他用其他手段绕过了你的前端控制,那也无所谓,你服务器端代码是对的,他再怎么折腾也是搞自己的号。你说呢?
@水牛刀刀: 以前的做的项目也用过客户端控制。有一些严密的系统还是客户端和服务器端都做的。但是这个项目不行,手机的项目,现在还是有很多手机不支持脚本语言的。这也是不能使用cookie的原因。
客户端脚本不能用?那session呢?页面传值呢?
session可以用。不知道你说的页面传值具体指的什么。
url参数不可以用,也不会具体改某个页面。因为是要在共同里面实现2重启动检查。不需要在具体页面中添加任何东西。
@刘鸿海:话说。我不太明白你要干什么。共同是什么? 如果只是要添加hidden的话 在页面定义一个runat=“server”的DIV 或者别的,样式设置为display:none; 然后后台innerhtml赋值就行了吧。
@我有我的骄傲: 首先不能改具体的页面。其次不知道你对.net MVC理解多少。mvc里面在controller中是不能直接设置控件的属性的,都是通过model或者viewdata或者tempdata.所以runat="server"也就没有什么意义了。
@刘鸿海: 不能改具体的页面?是说页面不能改? div跟 controller有关系?不懂。求教?
不就是 WebForm 中的 Post Back 嘛,自己重写一个 Hidden 就行了。
Html.MyHidden(......)
是要在共同里面实现向页面中添加Hidden域,而不允许修改具体的页面。