1

I wanna try to make this is as simple as possible.

Lets say I have a Project Model and a Task Model

I want to create a Project with 3 tasks assigned to that project in one single form

Whats the best way to do this??

Would the method simply receive a Project or what else do i need to have there.. will just saving the project (in repository) also save the related tasks?... In the view... do i need a viewModel.. Im confused. please help

public ActionResult Create(Project p){

}

2 Answers 2

1

Here's how I would proceed:

public class TaskViewModel
{
    public string Name { get; set; }
}

public class ProjectViewModel
{
    public string ProjectName { get; set; }
    public IEnumerable<TaskViewModel> Tasks { get; set; }
}

then have a controller:

public class ProjectsController: Controller
{
    public ActionResult Index()
    {
        var project = new ProjectViewModel
        {
            // Fill the collection with 3 tasks
            Tasks = Enumerable.Range(1, 3).Select(x => new TaskViewModel())
        };
        return View(project);
    }

    [HttpPost]
    public ActionResult Index(ProjectViewModel project)
    {
        if (!ModelState.IsValid)
        {
            // The user didn't fill all required fields =>
            // redisplay the form with validation error messages
            return View(project);
        }

        // TODO: do something with the model
        // You could use AutoMapper here to map
        // the view model back to a model which you 
        // would then pass to your repository for persisting or whatever

        // redirect to some success action
        return RedirectToAction("Success", "Home");
    }
}

and then the view (~/Views/Projects/Create.cshtml):

@model AppName.Models.ProjectViewModel
@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.ProjectName)
        @Html.EditorFor(x => x.ProjectName)
        @Html.ValidationMessageFor(x => x.ProjectName)
    </div>

    @Html.EditorFor(x => x.Tasks)

    <input type="submit" value="Create!" />
}

and the corresponding task editor template (~/Views/Projects/EditorTemplates/TaskViewModel.cshtml):

@model AppName.Models.TaskViewModel
<div>
    @Html.LabelFor(x => x.Name)
    @Html.EditorFor(x => x.Name)
    @Html.ValidationMessageFor(x => x.Name)
</div>
Sign up to request clarification or add additional context in comments.

Comments

0

Add a collection of Task models to the Project model, and use a foreach loop to display the tasks, or repeat a partial view that knows how to display a single task.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.