1

我们有一个显示用户列表的用户信息的表单。我们有一个操作链接可以转到详细信息视图,以便用户更新信息。我们的应用程序是 ASP.Net 4.0 和 MVC 的混合体。我们通常使用加密来屏蔽我们在查询字符串中使用的变量,但是当我们尝试加密查询字符串时,MVC 会阻塞。我们正在使用 Microsoft Enterprise 5.0 Cryptogrophy 类。我们将如何加密查询字符串或在不使用查询字符串的情况下传递数据?我们将 MVC 4 与 Razor 一起使用。

我们目前正在做这样的事情:@Url.Action("Edit", "User", new {id = user.Id}

顺便说一句,我是 MVC 的新手,所以可能有一个我不知道的简单答案。

如果我们根本不能使用查询字符串,那就太好了。

4

2 回答 2

2

简单的答案:POST。使用表单或 AJAX 调用将值作为 POST 数据发送,并有一个控制器方法,其名称与现有方法相同,但标有[HttpPost]属性(也将现有方法标记为[HttpGet])。这个新的 POST 方法的参数可以是任何你喜欢的;它们在发布时可能会变成字符串(特别是如果您使用 AJAX),但 MVC 足够聪明,可以再次将它们转换回来,前提是它们的名称相同。所以,一个类似这样的表格:

@using (Html.BeginForm("Edit", "User", FormMethod.Post, new { id = "mainForm" }))
{
    <input id="userId" type="text" />
    <input type="submit" />
}

将整齐地对应于这样的控制器方法:

[HttpPost]
public ActionResult Edit(int userId)
{
    //do whatever
}

前提是您已正确注册路线。如果您的 GET 方法有效,那么相同的路由将在这里有效,只要它不会对 URL 参数造成任何问题。

同样的方法也将接受来自 AJAX 调用的提交,如下所示:

$.ajax({
    type: "POST",
    url: '@Url.Action("Edit", "User")',
    data: { userId: @user.Id },
    success: function (data) {
        //do whatever
    }
});
于 2013-02-15T17:21:28.743 回答
1

我同意 anaximander 的观点,但如果您要花很多精力来保护查询字符串信息,表单只需将信息移动到 HTML 字段而不是查询字符串参数。如果您需要保留现有的实现,您可以考虑从默认的 ModelBinder 继承,并提供您自己的自定义实现以在将其移交给基类的实现之前将其从加密的查询字符串转换为未加密的查询字符串。

于 2013-02-15T18:28:53.490 回答