使用TryUpdateModel绑定部分提供的值

时间:2013-09-12 11:12:01

标签: asp.net-mvc

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

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

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');
    }

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

显然我做错了什么,但我无法弄清楚是什么。

3 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分:0)

您可以使用overload 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');
}

我从未尝试过,如果按预期工作,你能告诉我们吗?

答案 2 :(得分:0)

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

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