【问题标题】:ASP.NET MVC Model confusionASP.NET MVC 模型混淆
【发布时间】:2010-12-28 14:26:48
【问题描述】:

背景

我正在学习如何正确使用 ASP.NET MVC,并在模型中遇到了这个问题:

我有一个描述contact 的模型我可以从表单中得到它来创建一个新的contact,但是说当我们编辑一个表单时,我从存储库中检索它,显示联系人上的字段表单,然后获取contact 对象并将其发送给模型。

问题

我有一个业务规则,有些字段创建后不允许编辑,而其他字段只有在编辑后才可用。

我从用户那里收到了一个脏对象(带有他们应该触摸的字段)并使用 MVC 绑定方法(在方法签名中指定对象)用户插入了一个不可编辑的字段contact_dob

问题

  1. 我是否应该再次检索记录,只覆盖我要更新的字段,然后将其发送到数据库?

  2. 当我不想再次从数据库中检索整个对象时,最好的方法是什么,我是否只是重做另一个 EntityModel,它是主模型的较轻版本并来回使用它?

  3. 我是不是走错了路?限制用户可以编辑的内容的最佳做法是什么?

【问题讨论】:

    标签: c# .net asp.net-mvc model-view-controller model


    【解决方案1】:

    我认为你可以构建你的模型,Contact 类,在编辑视图中你应该只允许可以编辑的字段,隐藏或设置为不可编辑你不想被编辑的字段,然后在您的控制器将获得原始联系人并使用您在编辑视图中允许的字段值对其进行更新,例如:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection formValues) {
        Contact contact = repository.GetById(id);
        try {
            UpdateModel(contact);
            repository.Save(contact);
            return RedirectToAction("Details", new { id=contact.Id });
        }
        catch(Exception ex) {
            // Do something...
        }
    
        return View(contact);
    }
    

    【讨论】:

      【解决方案2】:

      您应该在操作方法中使用EXCLUDEINCLUDE约束。这样,您的模型将在模型绑定期间排除不需要的字段。

      public ActionResult Create([Bind(Exclude="contact_dob")] Contact contact)

          {
              _db.AddToContacts(contact);
              _db.SaveChanges(); 
              return RedirectToAction("Index");
          }
      

      【讨论】:

      • 太酷了,我不知道你能做到这一点!在您的 SaveChanges 方法中,人们如何管理它?
      • @Lisa Auckett:你会在你的存储库中实现它;但他所说的“SaveChanges”方法实际上是 ORM 的一部分——Linq-To-SQL。
      【解决方案3】:

      “最佳做法”是针对您提交的模型完成validation,并且不允许更改某些字段。你可以使用JQuery/JavaScript来grey out textboxes that cannot be changed;以及模型端的验证以禁止更改某些字段(通过将它们与来自数据库的内容进行比较)。

      您可以使用Model Validation 禁止更改某些字段。 ASP.NET MVC 2 具有此功能。您甚至不需要重新检索对象。

      在“NerdDinner Walkthrough”(ASP.NET MVC 1.0)中,有一个walkthrough of Validation

      【讨论】:

        【解决方案4】:

        听起来最好的解决方案是使用自定义 ViewModel。这是一个包含您希望用户提交给控制器的所有字段的对象。

        您将需要从数据库中重新加载联系人对象 - 我认为您无法在不解决其他问题的情况下解决这个问题。

        public ActionResult Edit(ContactViewModel viewModel)
        {
            var contact = repository.GetContacts().WithId(viewModel.Id);
        
            // Update the contact with the fields from the viewModel
        
            repository.Save(contact);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-09
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 2015-09-20
          • 2011-01-19
          相关资源
          最近更新 更多