Asp.net mvc ASP.NET MVC:禁止用户编辑模型上的某些字段

Asp.net mvc ASP.NET MVC:禁止用户编辑模型上的某些字段,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我有一个模型,其中有几个字段,我永远不想被用户编辑。我如何创建一个编辑页面,不仅隐藏这些字段,还可以防止用户自己注入输入元素 谢谢请看一下TryUpdateModel()()。您可以指定希望方法实际更新的黑名单和白名单: public ActionResult MyUpdateMethod (MyModel myModel) { if (ModelState.IsValid) { var myDomainModel = new DomainModel ();

我有一个模型,其中有几个字段,我永远不想被用户编辑。我如何创建一个编辑页面,不仅隐藏这些字段,还可以防止用户自己注入输入元素


谢谢

请看一下
TryUpdateModel()
()。您可以指定希望方法实际更新的黑名单和白名单:

public ActionResult MyUpdateMethod (MyModel myModel)
{
    if (ModelState.IsValid)
    {
        var myDomainModel = new DomainModel ();
        if (TryUpdateModel (myDomainModel,
                            new string[] { /* WhiteList Properties here */ },
                            new string[] { /* BlackList Properties here */ })

        {
            // Save it or do whatever
            return RedirectToActionV (/* Yada */);
        }
    }

    return View (myModel);
    }
}

除此之外,我还要确保您发布的模型不包含您希望用户更新的字段,尽管可以用手工制作的表单post覆盖这些字段。这至少有助于确保您不会意外地将字段放在不希望编辑的页面上。

如果您不希望字段可编辑,为什么要首先在编辑表单中使其可编辑?使用两个单独的视图模型。一个用于显示所有必要数据的GET请求。只读数据将只是文本/标签。第二个视图模型将用于POST/PUT请求,其中您只传递可编辑的数据

如果在任何情况下,您需要一些数据进行往返,您可以将它们放在隐藏字段中,并使用第二个隐藏字段和散列。您可以得到类似散列的(伪代码):


盐是只有您的应用程序才知道的秘密值。当数据往返到您的应用程序时,您将再次计算哈希(您必须使用相同的salt),并将其与存储在请求中的哈希进行比较。如果这两个字段不同,则用户会尝试操作这些隐藏字段。

与其对基础模型执行编辑操作,使所有字段都可以编辑,不如创建一个单独的模型,其中只包含要编辑的字段。这种ViewModel方法更安全,避免了必须始终指定属性列表(如白名单/黑名单方法)的问题


有关更多信息,请参见此链接:

您可以通过在模型类的顶部添加此链接来防止HTTP(也称为用户)修改字段

// Exclude Fields from being modified by user
[Bind(Exclude = "ID, Name, other fields you want excluded")]
public class YourModel
// Exclude Fields from being modified by user
[Bind(Exclude = "ID, Name, other fields you want excluded")]
public class YourModel