【问题标题】:MVC Partial Model UpdatesMVC 部分模型更新
【发布时间】:2011-09-01 21:05:06
【问题描述】:

我经常发现自己只想呈现和编辑模型中的某些字段。假设我有一个表示地址的模型,也许我只想让表单更新城市和邮政编码字段(不好的例子,但希望它能解释场景)。

我知道两种方法:

1) 在表单的隐藏输入元素中保留不需要的字段,或者... 2) 创建一个专门的视图模型,只定义我需要的字段。

我赞成选项 #2,但我没有一种干净的方式将视图模型中的数据合并回控制器操作中的“真实”模型。目前,我遵循这种方法...

1) 将记录存储在视图模型的隐藏字段中 2)当页面回发时,控制器检索原始记录,我手动将视图模型中的每个字段分配给真实模型 3) 将真实模型保存回数据存储区。

这可行,但工作量很大,很容易错过分配/重新分配,我想知道是否有人知道另一种方法?

【问题讨论】:

  • 你反对使用Session吗?
  • 我们通常会尽量避免使用 session,但除了我们发现它难以管理(在清理方面)之外没有任何真正的理由这样做
  • 我现在正在尝试使用自定义模型绑定,其中首先绑定身份属性,触发 VM 从存储库加载,然后,剩余的绑定过程像合并一样运行。 See my S.O. question and proposed answer here

标签: asp.net-mvc model


【解决方案1】:

使用System.ComponentModel.DataAnnotations.MetadataType

类似:

public class BaseClassOfProperties
{
   public string Name { get; set; }
}

public interface INameViewableProperties
{
   [Display(name = "Your Name")]
   string Name { get; set; }
}

public interface INameHiddenProperties
{
   //[scaffoldColumn(false)] this completely hides the fields
   [UIHint("Hidden")] // i think...
   string Name { get; set; }
}

[MetadataType(typeof(INameViewableProperties)]
public class NameViewAbleProperties : BaseClassOfProperties
{
}

[MetadataType(typeof(INameHiddenProperties)]
public class NameHiddenProperties : BaseClassOfProperties
{
}

【讨论】:

  • 谢谢 Erik,我以前从未见过这种方法,它看起来非常干净/灵活。我不太确定它如何帮助我管理实际的更新过程,将数据保存回底层数据库(我们使用的是 Linq to Sql)。如果你有时间,也许你可以进一步扩展一点?
  • 是的,我创建了向导,每个页面都是不同的 MetadataType,只需要我想要的字段和验证。然后所有其他字段只是隐藏的输入字段。我走这条路是因为向导下一部分可用的选项需要知道以前的用户值。最后,我有一个非常大的界面来验证我的所有字段。一个具有多个脚手架和验证的模型。
  • 谢谢埃里克。我将使用这种方法,看看它如何适合我的应用程序。无论哪种方式,我都学到了一些东西,因为我不知道您可以将属性应用于接口类:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 2011-09-06
  • 2015-12-01
  • 2012-08-04
相关资源
最近更新 更多