【问题标题】:How can I encode an id in url in ActionResult in asp.net mvc如何在 asp.net mvc 中的 ActionResult 中的 url 中编码 id
【发布时间】:2016-05-12 21:27:32
【问题描述】:

我需要在返回视图之前对 id 进行编码。传入 url 时很容易猜到 id,所以我尝试在返回 View 之前进行编码

     [HttpGet]
    public ActionResult Index(int id = 0)
    {
        var model = new ReviewModel();
        if (id != 0)
        {
            model.Id = id;
            model = model.Get();
             //How can I encode model.Id here***
        }
        ViewBag.IsAdmin = model.IsAdmin(User.Identity.Name);
        model.SaveAudit("Visits Code of Conduct", User.Identity.Name);



        return View(model);
    }

【问题讨论】:

  • 不要使用不断增长的数字 ID,而是使用哈希值来识别您的模型实体。您需要将这些哈希值与其他模型属性一起存储。
  • 顺便说一句,您的Index 操作无关紧要,除了将int id 更改为string hash 或类似的东西外,它将保持不变。重要的部分是创建和保存模型实体的位置。在这样的地方,您必须创建实体的哈希。其余的保持不变。
  • 如果没有您发布的代码,这个问题也不会有所不同。你基本上是在要求人们做你的功课。

标签: c# asp.net asp.net-mvc razor


【解决方案1】:

考虑非整数标识符或手动加密/解密

由于它是一个整数,如果您仍想考虑将其存储在模型中,那么您尝试对其进行编码的选择将相当有限。如果您能够存储某种类型更独特的标识符,例如 Guid,那么这可能会更可取,因为它会删除用户试图“猜测”或更改值的元素。

我想您可以根据您的整数值创建某种类型的哈希并将其传递(您需要相应地更新您的值),然后在请求 similar to the approach mentioned in this threadPOST 一侧解密哈希值。

可能是临时存储使用

一个考虑可能是使用某种形式的临时存储,如TempData 来存储值,以便在后续请求中可用:

if (id != 0)
{
        model.Id = id;
        model = model.Get();
        // Store the ID in TempData
        TempData["CurrentReviewID"] = id;
} 

然后,当您的以下请求被触发时,大概是与之对应的POST 被触发,您可以从TempData 集合中读取您的值并使用它:

[HttpPost]
public ActionResult Index(ReviewModel model)
{
      // Resolve your ID here
      int int = Convert.ToInt32(TempData["CurrentReviewID"]);

      // Continue as expected
}

这样的方法或 gulp Session 可用于在请求之间持久保存此类信息,但这可能会为您的应用程序添加一个状态元素,您通常希望在MVC 应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多