0

我有一个要在详细信息视图中显示的对象。该对象有一堆视图需要的属性。

该对象还有父母和祖父母,我需要在视图中显示它们。

我的对象 viewModel 是:

public class ObjectViewModel
{
    // Used when creating a new object under a parent object
    [HiddenInput(DisplayValue = false)]
    public int? ParentObjectId { get; set; }

    [Required]
    public Object Object { get; set; }

    // Info that only the view needs, which is defined in the Controller based on some logic
    public string ActiveTitle { get; set; }

    // A bre
    public IList<Object> ParentObjects { get; set; } 
}

然后我在我的 Detail 控制器方法中使用它:

public ActionResult Detail(int objectId)
{

    // TODO: Make this a service call
    var object = _db.Objects.FirstOrDefault(s => s.ObjectId == objectId);

    if (object == null)
    {
        return View("Error");
    }

    var model = new SetViewModel() { 
         ActiveTitle = object.Name, 
         Object = object, 
         ParentObjectId = object.ParentObject.ObjectId, 
         ParentObjects = _objectService.GetParentObjects(set.ParentObject)
    };

    return View(model);
}

这看起来对吗?或者我应该将所需字段从对象模型拉到视图模型中,而不是对象本身?

4

3 回答 3

0

任何一个选项都可以,并且您通常会在给定的应用程序中混合使用这两种技术。

关键思想是您的视图模型应该包含视图所需的内容,以便向用户显示数据。

如果您的视图仅在简单的控件中显示单独的原始字段,例如一系列标签或文本框控件,那么您的视图模型可能应该只指定字段,而不是父对象。

但是,您的视图很可能包含“知道如何”完整显示复杂对象的模板化或自定义控件。在这种情况下,您的视图模型需要包含整个对象。(在实践中,我发现自己在 WPF 中比在 ASP-MVC 中更频繁地执行此操作,但我两者都做过)。

于 2013-02-19T17:42:04.573 回答
0

看起来答案将是上下文的。许多使用分层架构的团队可能会采用架构约定,即您的视图不应直接引用 X 之下的层,并且数据访问类可能是此类限制的候选对象。在您的情况下,看起来您将视图的结构直接绑定到数据库模式的结构(假设,因为您使用的是“_db”),这可能被认为是不合理的紧密耦合。

另外,我假设您使用“对象”来表示“任何一般事物”而不是字面意义上的 System.Object,因为您的对象在 lambda 表达式中似乎具有 ObjectId 属性。

于 2013-02-19T17:44:17.083 回答
0

在你的视图模型中有一个对象类型是非常模糊的,如果你不是最初的程序员,你的代码将很难支持。我会将类类型添加到实际模型中或使用泛型来指定类类型,如下所示:

public class ObjectViewModel<T>
{
    // Used when creating a new object under a parent object
    [HiddenInput(DisplayValue = false)]
    public int? ParentObjectId { get; set; }

    [Required]
    public T Object { get; set; }

    // Info that only the view needs, which is defined in the Controller based on some logic
    public string ActiveTitle { get; set; }

    // A bre
    public IList<T> ParentObjects { get; set; } 
}
于 2013-02-19T17:48:29.667 回答