MVC ViewModel - 如何处理此要求

时间:2014-11-09 14:37:24

标签: c# asp.net-mvc asp.net-mvc-4

我有什么(我确定)要解决这个非常简单的问题,因为它必须是一个常见的要求。但是,我对此并不熟悉,似乎无法找到可以帮助我解决问题的信息。

我的域名模型:

-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添加属性来实现此目的。

任何人都可以给我一些建议/指出我正确的方向吗?

2 个答案:

答案 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添加到请求中,或者每次都查找它。