我有什么(我确定)要解决这个非常简单的问题,因为它必须是一个常见的要求。但是,我对此并不熟悉,似乎无法找到可以帮助我解决问题的信息。
我的域名模型:
-Project(ID,ProjectName,Client)
演员(ID,ProjectId,标题,描述)
在我的演员CRUD上我想将Project Name显示为一个只读字段(我的应用程序已经知道我想要将actor添加到哪个项目中)。
所以,我需要创建一个视图模型,让我了解项目名称以及该项目的所有演员。以下是我到目前为止的情况:
public class ActorsViewModel
{
//properties
public string projectName {get; set;}
public List<Actor> projectactors {get; set;}
//constructor
public ActorsViewModel (int projectId)
{
//TODO
/*
project = //get the project name from the projects table
projectActors = //get all of the actors for this project
*/
}
我的目标是在索引上,演员将列出他们的项目名称。在编辑和创建时,表单将自动填充项目名称(并且它只是readonly - 我打算通过向HTML Helper添加属性来实现此目的。
任何人都可以给我一些建议/指出我正确的方向吗?
答案 0 :(得分:1)
这需要进入您的控制器:
public ActionResult Edit(int projectId)
{
using(var context = new CustomDbContext())
{
var model = new ActorsViewModel()
{
projectName = context.Projects.FirstOrDefault(p => p.Id = projectId).Name,
projectactors = context.Actors.Where(a => a.ProjectId == projectId).ToList()
}
}
return View(model);
}
请注意,您不希望在控制器中创建这样的上下文,而是将其注入(或使用服务或其他内容)。这只是为了让你前进,而不是展示最佳实践。
但您确实需要控制器中Web项目中的任何逻辑,而不是视图模型中的逻辑。
答案 1 :(得分:0)
要确保无法更改名称,您可以通过删除属性的setter并在构造期间初始化名称,将其隐藏在viewmodel中。
public class ActorsViewModel
{
public ActorsViewModel(){} //Default ctor for modelbinder and co
public ActorsViewModel(string projectName)
{
ProjectName = projectName;
}
public string ProjectName {get; }
public List<Actor> ProjectActors {get; set;}
}
缺点是在Post Controller Actions中你需要将projectId / ProjectName添加到请求中,或者每次都查找它。