2

I'm crating a simple MVC app that has People and Notes tables.

Using the repository method and LINQ to SQL to access the data.

Each person has a single note for a day and the note has a CreatedAt. Foreign Key in Note table as PersonID.

I have managed to get CRUD working for both Person and Note independently but I'd like to be able to display the note of a single person for a single day in my view.

In my repository I've created a helper which I think should work, but I'm not sure how I'd use it in my controller.

public IQueryable<Note> FindSinglePersonsNote(int id)
{
    return from Note in db.Notes
           where Note.CreatedAt > DateTime.Now.AddDays(-1)
           && Note.PersonId == id
           select Note;
}

What I'd like to happen is when I click on the person details link, to show the Persons name and the note connected to that person for today.

Any help would be appreciated.

Cheers

Tom

Update:

I think I'm getting close...

My Person controller now looks like this

public ViewResult PersonNote(int personId)
{
    var personNote = new PersonNoteViewModel
    {
        person = scrumRepository.GetPerson(personId),
        note = scrumRepository.GetNote(personId)

    };

    return View(personNote);
}

And I created a new view called PersonNote

And tried to access the values like so:

<%= Model.person.PersonName %>
<%= Model.note.Issues %>

And my repo looks like this:

    public Note GetNote(int id)
    {
        return db.Notes.SingleOrDefault(d => d.PersonId == id);
    }


    public Person GetPerson(int id)
    {
        return db.Persons.SingleOrDefault(d => d.PersonId == id);
    }

But I'm getting a very strange error when I try to view the page.

The parameters dictionary contains a null entry for parameter 'personId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ViewResult PersonNote(Int32)' in 'ScrumApp.Controllers.PersonController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

3
  • The error means that you didn't specify a personID in your URL somewhere, or the route didn't pick up the personID parameter. Make sure you check out the NerdDinner tutorial; it contains prototype code for these things. Commented Jul 22, 2010 at 21:25
  • The personId was specified but it didn't like the (personID) used in my controller. I switched that to (id) and things got better. It now displays a person name and their note (so long as I only have one note per personId in my datebase. Thank you so much for your help with this! It's for a presentation tomorrow. You're a life saver! Commented Jul 22, 2010 at 21:34
  • Your welcome. I edited my answer to track better with the id. FYI: id works because it is in your default route. Commented Jul 22, 2010 at 21:38

1 Answer 1

4

Create a ViewModel object that looks something like this:

public class PersonNoteViewModel
{
    public Person person { get; set; }
    public Note note { get; set; }
}

Populate an instance of this object in your controller method using your repository, and then pass this object to your view for display:

public ViewResult PersonNote(int id)
{
    var personNote = new PersonNoteViewModel
    {
        Person = repository.GetPerson(id);
        Note = repository.GetNote(<blah>);
    }

    return View(personNote);
}
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you for your answer. I had a feeling it would come down to viewmodels. I've created that view model, but I'm unsure how to put an instance of it in the controller method and then pass the object to the view. I presume it's something like this: var viewmodel = new PersonNoteViewModel { person = new Person(), note = new Note() }; But I'm not really sure what to do with it next or exactly how to instantiate it.
Thanks again Robert! I feel I'm almost there. I've updated my original question to reflect what's happening now. Tom

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.