我有一个场景,我需要从发布到操作的信息更新对象。只要信息在页面中,这就可以了。但是,如果我不希望模型状态抱怨,则需要将信息放入隐藏字段。
举个例子,假设我使用下面的类作为模型:
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');
}
问题是,模型状态仍然抱怨“名称”值即使从数据库加载到客户端对象也不可用。
显然我做错了什么,但我无法弄清楚是什么。
答案 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中删除验证,如果那些字段不存在,这对我有用,因为从数据库中检索这些值。