【问题标题】:asp.net mvc custom model binding in an update entity scenario更新实体场景中的asp.net mvc自定义模型绑定
【发布时间】:2010-05-18 19:45:18
【问题描述】:

您好,我有一个关于模型绑定的问题。假设您有一个显示在表单中的现有数据库实体,并且您想编辑一些详细信息,某些属性(例如 createddate 等)未绑定到表单,在模型绑定期间,这些属性未分配给模型,因为它们不在http post data 或 querystrong 等,因此它们的属性为空。在我的更新控制器方法中,我只是喜欢这样做

公共 ActionResult 更新(实体) { //保存对数据库的更改 }

但由于某些属性在 ent 中为空,它们会覆盖不属于表单发布数据的现有数据库字段,处理此问题的正确方法是什么?我试过隐藏字段来保存数据,但模型绑定似乎没有将隐藏字段分配给模型。任何建议将不胜感激

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    您不应该将您的实体发送到您的视图,您应该发送它的精简版本,称为 DTO(数据传输对象)或 ViewModel。

    仅将属性发送到您希望用户使用该操作更新的视图(以及因此回发的表单)。

    在您的 POST 处理程序中,您可以验证属性并将其复制到您的实体。

    如果您有很多属性,AutoMapper 可以提供帮助

    类似:

    public class User
    {
        int id;
        string name;
        string email;
    }
    
    public class EditUserEmailDto
    {
        string email;
    }
    
    // get
    public ActionResult EditEmail(int id,)
    {
        return View("EditEmail", new EditUserEmailDto());
    }    
    
    // post
    public ActionResult EditEmail(int id, EditUserEmailDto dto)
    {
        if(!ModelState.IsValid)
            return View("EditEmail", dto);
    
        var user = userRepo.Get(id);
        user.email = dto.email;
        userRepo.Save(user);
    
        return;
    }
    

    【讨论】:

    • 这是有道理的安德鲁,感谢您的回复。我认为您的解决方案适用于一个简单的场景,当您使用适用于保存和更新场景并且需要将值分配给类型而不是 viewdata 的自定义模型绑定器时如何。您将如何处理?
    • 还有你将如何利用模型验证等功能?
    • 第 1 条评论:不确定我明白你的意思,你能解释一下这个问题吗?关于第二条评论,我在活页夹中进行验证,这样可以保持帖子处理程序整洁。生病更新答案以显示处理程序的示例,但验证位在这里可能是矫枉过正的。基本上我扩展DefaultModelBinder,覆盖BindModel,调用base.BindModel,然后从我的IoC容器中获取模型类型的验证器,验证模型,然后将任何错误粘贴到ModelState
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多