我现在有两个控制器操作:一个显示强类型视图,一个是基于唯一标识符,另一个是更改模型。以下是一些可视化我的意思的代码:
[HttpGet]
[ActionName("Edit")]
public ActionResult UpdateDevice(string code)
{
// Request the device based on the code.
var device = GetDeviceModel(code);
// Present the device in a view.
return View(device);
}
[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
}
代码标识设备,但也可以更改它。这就是我的问题:在post方法中我可以使用model.Code
访问 new 代码,但我还需要知道旧代码,才能够改变它。
我尝试了几种替代品,但没有一种能满足我的要求:
ViewData
在帖子之前不会保留。TempData
基于会话或Cookie - 我现在不想使用它们。最后,我尝试从查询字符串中请求数据,如下所示:
[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
var oldCode = Request.QueryString["code"];
}
这有效!但我没有在网上找到任何资源。所以我的问题是:在post操作中使用查询字符串是否可以安全地防止修改?什么(如果有的话)是有效的条件?
如果这不是“记住”代码的有效方式,还有其他选择吗?
答案 0 :(得分:0)
我认为您可以在DeviceModel
名称OldCode
内创建另一个媒体资源。
并且在您的视图中,您可以将此值保存在隐藏字段中,如此
@Html.HiddenFor(m=>m.OldCode)
现在在控制器发布方法中,您可以获得这两个值。
[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
var oldcode=model.OldCode;
var newcode=model.Code;
}
希望这会有所帮助......
答案 1 :(得分:0)
根据您在问题中提到的要求,您似乎在寻找案件的安全性。所以我会说QueryString
不安全。在我看来,使用Session
变量是将关键数据保存在安全位置的适当方法。你可以使用像这样的方法
[HttpGet]
[ActionName("Edit")]
public ActionResult UpdateDevice(string code)
{
Session["code"] = code;
....
}
[HttpPost]
[ActionName("Edit")]
public ActionResult UpdateDevice(DeviceModel model)
{
if (Session["code"] == null)
throw new Exception("Error Message.");
var code = Session["code"].ToString();
....
Session["code"] = null;
}
答案 2 :(得分:0)
通过GET或POST请求提交的任何内容都不会被修改。虽然GET查询字符串显然很容易修改,但它也不需要花费太多精力来欺骗POST变量。听起来像你需要重新思考你的方法。
最理想的情况是,您可以检查服务器端的权限,以确定是否允许用户使用传递的(旧)代码更新设备。如果他们没有权限,则返回错误,例如HTTP 550代码。
如果您真的不支持这种方法,我建议按照其他人的建议将“OldCode”字段添加到DeviceModel类,但在将其发送到客户端之前加密。然后,您可以安全地将其写入隐藏字段,并在服务器上进行解密,而无需担心用户更改值。