我一直在看C#MVC已经有一段时间了,并且真正进入了它。我遇到过如何将2个或更多域模型传递到View中,但我需要问的是安全性。我已经读过有关Over Posting的内容,可以使用Binding包含和排除来停止,但是这会如何影响其中包含2个或更多Model的ViewModel。 HTML中是否仍有隐藏字段可以解析为域模型,并且可以编辑它们。
我一直在寻找制作ViewModel的地方,我给它一些我希望用户编辑的东西,但它看起来似乎过于复杂,所以有更好更简单的方法。
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;
}
}
}
正如您所看到的,我使用Ticket Domain Model创建了一个新的ViewModel,但我主要担心的是返回一个域模型注释列表,因为我只希望它们是只读的。
非常感谢任何帮助。
答案 0 :(得分:1)
为安全起见:
如果我得到你的要求那么 首先,用户可以编辑客户端的所有内容,但我们无法为此做任何事情 但是,如果您没有在服务器端添加代码而不是使用您的应用程序可以更改数据,那么您也可以在服务器端添加验证。
用于在ViewModel中添加List:
public class MainViewModel
{
public string Title{get;set;}
public List<Comment> ListComments {get;}
}
&#34;我正在返回一个域模型评论列表,因为我只想让它们只读#34;
你可以使用它,
public List<Comment> Comments { get; }
答案 1 :(得分:0)
考虑ReadOnlyCollection和List提供的方法AsReadOnly。
您的评论属性可以重写为 -
public List<Comment> Comments
{
get
{
return _ticket.Comments.AsReadOnly();
}
}
答案 2 :(得分:0)
如果您不希望某些内容可以编辑,请不要修改它。我认为这与MVC无关。您可以控制服务器代码,所以如果您想要评论是readonly,只是不要在服务器代码中修改它们。所有这些&#34;模型&#34;只要您的HTML在服务器上呈现就存在。
客户本身无法修改您的数据库,只能修改它的HTML或向您的服务器发送请求。它是您实际修改内容的服务器代码。
答案 3 :(得分:0)
看着这个,并且不知道它所处的上下文,我建议在你的视图中使用域模型本身,而不是将它包装在TicketViewModel中。 ViewModel似乎没有添加任何内容。
对于只读评论:我认为ViewModel中的集合是否可编辑并不重要。重要的是您不在视图中呈现可编辑的控件。最重要的是,Save(或其所谓的)操作中的代码忽略了发布的任何评论。