我正在构建一个asp.net MVC 2应用程序。
我有一个列表视图,它根据参数列出项目。在数据库中,我有一个父表和子表,所以我的列表视图列出了父id的id与参数中指定的值匹配的所有子记录。
这是我的控制器和型号:
public ActionResult List(int ParentID)
{
return View(new Models.ChildListModel(ParentID));
}
public class ChildListModel
{
public int ParentID {get;set;}
public ManagementUserListModel(int iParentID)
{
this.ParentID = iParentID;
this.Children = DataAccessLayer.ListChildrenForParent(iParentID);
}
public List<Child> Children {get;set;}
}
我还有一个细节并为该控制器创建操作。详细信息和创建视图有一个“返回列表”操作,我想返回列表视图,并维护原始的ParentID。到目前为止,我一直在通过在列表,编辑,创建和详细信息视图中创建一个名为ParentID的隐藏字段来实现此目的,以便正确填充模型的ParentID属性:
<%= Html.HiddenFor(model => model.ParentID) %>
然后在每个视图的“返回列表”操作中,我传递了ParentID:
<%=Html.ActionLink("Back to List", "List", new {ParentID = Model.ParentID}) %>
这一切都有效,但我不是在html中存储原始ID的忠实粉丝。有没有更好的方法来做到这一点?是否有一些内置的方式来加密数据(有点像标准的asp.net viewstate呢?)我只是想尝试实现某种防篡改,并试图避免使用会话状态(TempData等),因为我不想处理会话超时。
答案 0 :(得分:8)
您可以查看此article。您可以在视图中使用新的Html.Serialize
扩展方法,该方法允许您序列化整个对象并对其进行加密:
<%= Html.Serialize("person", Model, SerializationMode.Encrypted) %>
将模型序列化为隐藏字段并加密值。要恢复模型,请使用表单提交的控制器操作中的DeserializeAttribute
:
public ActionResult Edit([Deserialize]Person person) { }
答案 1 :(得分:2)
另一种不暴露id的方法,也没有增加后续表单帖子的权重(如Webform的ViewState和Html.Serialize那样)是使用session作为后台存储你的Model类。
public class ChildListModel
{
public int ParentID {
get
{
return (int)HttpContext.Current.Session["ChildListModel.ParentID"];
}
set
{
HttpContext.Current.Session["ChildListModel.ParentID"] = value;
}
}
public ManagementUserListModel(int iParentID)
{
this.ParentID = iParentID;
this.Children = DataAccessLayer.ListChildrenForParent(iParentID);
}
public List<Child> Children {get;set;}
}
如果您愿意,您甚至可以将整个Parent对象存储在您的模型中,而不仅仅是它的ID - 这会增加服务器上的会话大小,这可能是也可能不合适(取决于您的会话时长)持续,是否设置为存储在内存或sql server等中。)
答案 2 :(得分:0)
最简单的方法是将parentid保留在URL中。对于Create Action来说看起来有点奇怪,但我仍然认为这不那么麻烦。
如果您保持状态,那么您将遇到无法点击F5的问题而且您无法为该页面添加书签。
在这种情况下,反向链接是一个简单的ActionLink。
网址将是:
/ YourController /列表/ YourParentParameterValue
/ YourController /详情/ YourParentParameterValue / YourDetailParameterValue
/ YourController /创建/ YourParentParameterValue