C# 一个模型视图中有两个以上的模型

C# 一个模型视图中有两个以上的模型,c#,asp.net,asp.net-mvc,asp.net-mvc-4,mvvm,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Mvvm,我已经关注C#MVC有一段时间了,现在真的开始关注它了。我遇到过如何将2个或更多的域模型传递到视图中,但我需要问的是安全性。我读过关于过度发布的文章,这可以通过绑定包含和排除来停止,但这会如何影响包含2个或更多模型的ViewModel。HTML中是否仍有可能存在解析为域模型的隐藏字段,以及这些字段是否可编辑 我一直在寻找制作ViewModels的方法,我给它一些我想让用户编辑的东西,但是它看起来太复杂了,所以有没有更好更简单的方法呢 public TicketViewModel { pr

我已经关注C#MVC有一段时间了,现在真的开始关注它了。我遇到过如何将2个或更多的域模型传递到视图中,但我需要问的是安全性。我读过关于过度发布的文章,这可以通过绑定包含和排除来停止,但这会如何影响包含2个或更多模型的ViewModel。HTML中是否仍有可能存在解析为域模型的隐藏字段,以及这些字段是否可编辑

我一直在寻找制作ViewModels的方法,我给它一些我想让用户编辑的东西,但是它看起来太复杂了,所以有没有更好更简单的方法呢

public TicketViewModel {
    private Ticket _ticket;

    public TicketViewModel(Ticket Ticket)
    {
        _ticket = Ticket;
    }

    public string Title
    {
        get
        {
            return _ticket.Title;
        }
    }

    public List<Comment> Comments
    {
        get
        {
            return _ticket.Comments;
        }
    }
}
public TicketViewModel{
私人车票;;
公共票证VIEWMODEL(票证)
{
_票=票;
}
公共字符串标题
{
得到
{
返回_ticket.Title;
}
}
公开名单评论
{
得到
{
返回_ticket.Comments;
}
}
}
正如您所见,我使用Ticket域模型创建了一个新的ViewModel,但我主要关心的是返回一个域模型注释列表,因为我只希望它们是只读的

如有任何帮助,我们将不胜感激。

请考虑列表提供的方法

您的注释属性可以重写为-

public List<Comment> Comments
{
    get
    {
        return _ticket.Comments.AsReadOnly();
    }
}
公共列表注释
{
得到
{
return _ticket.Comments.AsReadOnly();
}
}

如果您不希望某些内容可编辑,请不要修改它。。我认为这与MVC无关。。您可以控制服务器代码,所以如果您希望注释是只读的,就不要在服务器代码中修改它们。只要在服务器上呈现HTML,所有这些“模型”就存在


客户端本身无法修改您的数据库,只能修改其HTML或向服务器发送请求。。实际上修改内容的是您的服务器代码。

看看这个,我不知道它所处的上下文,我建议您在视图中使用域模型本身,而不要将其包装到TicketViewModel中。ViewModel似乎没有添加任何内容


对于只读注释:我认为ViewModel中的集合是否可编辑并不重要。重要的是不在视图中渲染可编辑控件。最重要的是,Save(或其名称)操作中的代码会忽略发布的任何注释。

出于安全考虑:

public class MainViewModel
{

public string Title{get;set;}

public List<Comment> ListComments {get;}
}
如果我知道你在问什么 首先,用户可以在客户端编辑所有内容,我们对此无能为力。
但出于您的考虑,若您并没有在服务器端添加代码,那个么并没有人能够使用您的应用程序更改您的数据,您也可以在服务器端添加验证

用于在ViewModel中添加列表:

public class MainViewModel
{

public string Title{get;set;}

public List<Comment> ListComments {get;}
}
public类主视图模型
{
公共字符串标题{get;set;}
公共列表列表注释{get;}
}
“我正在返回域模型注释列表,因为我只希望它们是只读的”

你可以用这个

public List<Comment> Comments { get; }
公共列表注释{get;}

我不知道自己是否解释得很好。我听说并看到,您可以向服务器发送带有额外字段的HTTP帖子,这些字段没有显示在Razor HTML页面中,但仍然隐藏在页面的HTML中。这就是我所说的是的,用户可以通过http发送他想要的任何东西。。除了你需要的,你可以忽略一切。或者我没有抓住要点?你认为在ViewModel中放置ViewModel会违反标准吗?因此创建一个TicketViewModel并有一个CommentViewModels列表?你能更好地解释一下列表的意图吗?那么主ViewModel将是TicketViewModel,它将是父视图,然后我将有一个CommentViewModels列表(由注释域模型创建)作为父模型的子模型,因此我只能指定我想要获取和设置的内容?经验法则:只要您有理由证明它存在于强类型视图中。嵌套视图模型可以被视为定义视图的理想oop方法,但许多人会争论。如果您有任何顾虑,请不要公开您的实体模型()。Scott Allen的链接也解释了原因。您可以使用automapper()之类的工具来减轻冗余.Steve Fenton的论点是,在MVC中向浏览器公开您的模型会带来明显的安全风险。这不适用于WPF/MVVM应用程序。感谢您的所有回复。我可以从中得到的是,我认为公开域模型是一个坏主意,可以编辑。我认为我将采取的方法是创建strolgly typesld ViewModels,这样我可以控制给用户的内容以及可以获取和设置的内容。我还认为我将在ViewModels中使用ViewModels,这样一种父子系统可以真正控制一切。是的,列表属性不能再分配,但是列表的所有元素都可以修改、删除和添加到。