1

我有一个场景,我需要从发布到操作的信息中更新对象。只要信息在页面中,它就可以正常工作。但是,如果我不想让模型状态抱怨,它要求我将信息放入隐藏字段中。

例如,假设我使用下面的类作为模型:

public class Client
{
    [Required]
    public string Name { get; set; }

    public string Email { get; set; }

    public int Id { get; set; }
}

如果我不希望用户编辑名称,我需要将其包含在隐藏字段中,以便它绑定到模型并通过验证。

我遇到的问题是,如果与更敏感的信息一起使用,显然是不安全的。所以我尝试了这个:

public virtual ActionResult Save(Client model, int clientId)
    {
        var client = datasource.LoadEntity(adapter, clientId); // clientId is passed as a querystring to the action

        if (!TryUpdateModel(client))
            return new RedirectResult('The edit page URL');
    }

问题是模型状态仍然抱怨“名称”值不可用,即使它是从数据库加载到客户端对象的。

显然我做错了什么,但我不知道是什么。

4

3 回答 3

0

视图模型仅用于来自客户端的信息。

因此,您必须删除该Name属性并从其他地方获取它。

例如,如果这是管理员也使用的视图模型(谁能够输入/更改名称),那么最好是这样的派生视图模型:

public class Client
{
    public string Email { get; set; }
    public int Id { get; set; }
}

public class ClientWithName : Client
{
    [Required]
    public string Name { get; set; }
}
于 2013-09-12T11:33:32.030 回答
0

您可以使用重载 TryUpdateModel(TModel, string\[\]);如果我的理解是正确的,这应该允许指定要包含在更新中的属性,如下所示:

public virtual ActionResult Save(Client model, int clientId)
{
    var client = datasource.LoadEntity(adapter, clientId);

    if (!TryUpdateModel(client, new string[] { "Email" }))
        return new RedirectResult('The edit page URL');
}

我从来没有尝试过,你能告诉我们它是否按预期工作吗?

于 2013-09-12T11:45:00.487 回答
0

我已经采用了此处概述的解决方案:Asp.net MVC 3 Validation exclude some field validation in TryUpdateModel

本质上,如果这些字段不存在,它会从 Modelstate 中删除验证,这对我有用,因为这些值是从数据库中检索的。

于 2013-09-12T11:59:48.853 回答