在asp.net MVC中存储状态

时间:2009-12-31 09:36:15

标签: asp.net-mvc asp.net-mvc-2

我正在构建一个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等),因为我不想处理会话超时。

3 个答案:

答案 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