在MVC 4中,如何在不使用查询字符串的情况下将数据传递给控制器

时间:2013-02-15 17:09:12

标签: asp.net-mvc-4 parameters

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

我们目前正在做这样的事情:     @ Url.Action(“编辑”,“用户”,新{id = user.Id}

顺便说一下,我是MVC的新手,因此我可能会对此有一个简单的答案,我只是不知道。

如果我们根本不能使用查询字符串那将是非常好的。

2 个答案:

答案 0 :(得分:2)

简单的答案:POST。使用表单或AJAX调用将值作为POST数据发送,并使用与现有控制器方法相同的控制器方法,但标记为[HttpPost]属性(同样,将现有属性标记为{{1} })。这个新的POST方法的参数可以是你喜欢的任何东西;当他们获得POST(特别是如果你使用AJAX)时,他们可能会变成字符串,但MVC足够智能,只要它们被命名为相同,就可以将它们再次转换回来。所以,这是一个类似的形式:

[HttpGet]

将巧妙地对应于这样的控制器方法:

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

如果您已正确注册路线。如果您的GET方法正常工作,那么相同的路由将在此处工作,只要它不会对URL参数造成任何问题。

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

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

答案 1 :(得分:1)

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