2013-03-01 18 views
5

Ho sviluppato moduli ASP.NET per un po 'di tempo e ora sto cercando di imparare MVC, ma non ha assolutamente senso capire come farlo fare ciò che voglio. Forse ho bisogno di pensare alle cose in modo diverso. Ecco cosa sto cercando di fare con un esempio composto:MVC 4 Parziale con controller e vista separati

Obiettivo: utilizzare un file parziale, che può essere posizionato in qualsiasi punto del sito e accetta un parametro. Questo parametro verrà utilizzato per andare al database e ritrasferire il modello risultante alla vista. La vista mostrerà quindi una o più proprietà dei modelli.

Questo non è il mio codice, ma mostra quello che sto cercando di fare.

File: Controller/UserController.cs

[ChildActionOnly] 
public ActionResult DisplayUserName(string userId) 
{ 
MyDataContext db = new MyDataContext() 

var user = (from u in db.Users where u.UserId = userId select u).FirstOrDefault(); 

return PartialView(user); 
} 

file: Vista/Shared/_DisplayUserName.cs

@model DataLibrary.Models.User 

<h2>Your username is: @Model.UserName</h2> 

File: Visualizzazioni/Chi/Index.cshtml

@{ 
    ViewBag.Title = "About"; 
} 

<h2>About</h2> 

{Insert Statement Here} 

So che a questo punto ho bisogno di rendere un partial chiamato DisplayUserName, ma come fa a sapere quale vista usare e come faccio passare il mio userId al parziale?

È quello che mi aspetto è una domanda molto semplice, ma devo ancora trovare un tutorial che copre questo.

Grazie in anticipo per il vostro aiuto.

risposta

6

si dovrebbe chiamare Html.Action o Html.RenderAction come:

@Html.Action("DisplayUserName", "User", new {userId = "pass_user_id_from_somewhere"}); 

La vostra azione dovrebbe essere come:

[ChildActionOnly] 
public ActionResult DisplayUserName(string userId) 
{ 
    MyDataContext db = new MyDataContext() 

    var user = (from u in db.Users where u.UserId = userId select u).FirstOrDefault(); 

    return PartialView("_DisplayUserName", user); 
} 

Questo dovrebbe fare il trucco.

+0

Grazie per la risposta veloce e la risposta corretta - ha funzionato! Ho provato così tante deviazioni sulla struttura e su @ html.Options, ma nessuna ha funzionato. Sapevo che sarebbe stato semplice quando si sa come! Grazie ancora per il vostro aiuto. – McGaz

1

Mi assicuro sempre di chiudere MyDataContext ... Forse racchiudere tutto in un'istruzione using ... Se si nota quando VS lo fa per te, creano l'entità come variabile privata nella classe Controller (al di fuori del controller) e quindi chiuderlo con il metodo di smaltimento ... In ogni caso, credo che sia necessario assicurarsi che tali risorse vengano rilasciate per mantenere le cose senza intoppi. So che non è nella domanda, ma ho visto che sembrava vulnerabile.