C# ASP.NET MVC传递数据

C# ASP.NET MVC传递数据,c#,asp.net-mvc,entity-framework-4,C#,Asp.net Mvc,Entity Framework 4,大家好,我正在玩ASP.NETMVC和实体框架。我想知道处理从控制器到视图再到视图的数据传递的最佳方法是什么。我会解释得更清楚一点: 我有一个用于创建新“收据”对象的操作 因此,我基本上创建了一个收据,并预先填写了一些信息(包括授权用户和一些组ID信息),然后我可以将其发送到一个包含各种表单元素的视图,该表单元素允许用户填写其他缺少的字段并提交,以便添加新的收据。如果收据对象中的所有字段都显示在表单上,这一切都非常有效 如果我删除了用户不应触摸的表单元素(如组号、收据所属的用户id等),那么当我

大家好,我正在玩ASP.NETMVC和实体框架。我想知道处理从控制器到视图再到视图的数据传递的最佳方法是什么。我会解释得更清楚一点:

我有一个用于创建新“收据”对象的操作

因此,我基本上创建了一个收据,并预先填写了一些信息(包括授权用户和一些组ID信息),然后我可以将其发送到一个包含各种表单元素的视图,该表单元素允许用户填写其他缺少的字段并提交,以便添加新的收据。如果收据对象中的所有字段都显示在表单上,这一切都非常有效

如果我删除了用户不应触摸的表单元素(如组号、收据所属的用户id等),那么当我提交表单并在控制器中拾取表单时:

        [HttpPost]
    [Authorize]
    public ActionResult CreateReceipt(Receipt receipt)
    {

        if (ModelState.IsValid)
        {
            using (EntityFrameworkEntities context = new EntityFrameworkEntities)
            {
                context.AddToReceipts(receipt);
                context.SaveChanges();
            }
            return RedirectToAction("Index");
        }

        return View(receipt);
    }
然后,我填写并发送到视图的所有方便的预加载信息都不会随帖子一起返回。我知道我可以将UserID或GroupID放在一个隐藏字段中,然后将其与帖子一起返回,但这感觉不对。从技术上讲,有人可以进入,更改隐藏的值并重新提交帖子。然后我可以做检查,以确保所有东西都应该在它所属的地方,但这也让我感觉像是又一次访问数据库,以获取我曾经获得的信息


如果有人能详细介绍一下从模型到视图再到控制器传递数据的标准方式,那就太好了。谢谢你的时间和帮助

如果您担心有人篡改隐藏字段值以影响其他记录,请填充ID值并在隐藏字段中加密,然后在回发时解密。

我最近在现有应用程序中添加了类似的功能。这将扩展@Dave Swersky的答案

假设业务对象为

Receipt
ID
Cost
ShippingAddress
我想要一个视图模型

ReceiptViewModel
ID
Cost
CostHash
ShippingAddress
你的观点应该是

Html.HiddenFor(m => m.Id)
Html.HiddenFor(m => m.CostHash)
Html.LabelFor(m => m.Cost)
Html.LabelFor(m => m.ShippingAddress)
然后,对于业务对象到viewmodel的映射,除了要计算成本+私钥+可预测盐值(例如收据本身的ID)的Sha256散列(或其他散列)之外,它是简单的。您希望包含对象ID或其他变量但已知值的原因是系统用户无法绕过哈希

如果您只使用原始值+私钥,如果成本为10美元,那么每次10美元的输出将是相同的。这将允许一个人轻松地从不同的收据转换成本值和成本散列值,但是如果您添加ID作为salt的一部分,收据1的10美元散列值将不同于收据2的10美元散列值。如果您在同一个对象上有许多类似的值需要保护,您仍然担心用户可能会接受Cost和CostHash值,并将它们移动到不同的行项目中,您需要在salt中添加更多内容,例如项目的属性名称等


当视图模型发送回控制器时,您希望计算预期的成本散列,并将其与CostHash属性进行比较,验证它们是否相等。如果它们不同,则意味着试图篡改。

+1,这是主要答案,我在答案周围添加了一些更直接的帮助。这看起来确实是一个很好的解决方案,可以真正防止篡改和所有,我问得更多是因为我似乎不应该在表单中乱扔隐藏字段,而是以某种方式保留在往返过程中发送到视图的值。我可能错了,但我想这就是我发帖的目的:——)我肯定也会考虑这样做。谢谢你的信息!如果你不想让id字段出现在页面中,你仍然需要设计一些其他的方法将id传递给客户端,这样它就可以在回发时传回。不可能。是的,它必须存在于视图的某个地方,否则id在模型绑定上为空。哎呀@OP之前是一名webforms开发人员,使用webforms和viewstate时,我总是觉得在页面上使用隐藏字段是一件很麻烦的事情,但在使用MVC越来越多地使用隐藏字段之后,互联网就是这样运行的。
Html.HiddenFor(m => m.Id)
Html.HiddenFor(m => m.CostHash)
Html.LabelFor(m => m.Cost)
Html.LabelFor(m => m.ShippingAddress)