ASP.NET MVC 2 Beta – Hur använda Action och RenderAction?

Något vi har kunnat göra länge är att rendera partiella vyer med ASP.NET MVC är att använda Html.RenderPartial(). Det gör det möjligt att ange namnet på en vy, samt skicka in en eventuell modell som skall användas för den partiella vyn.

I ASP.NET MVC så får vi två nya metoder som går ett steg längre och ger oss mer kontroll över vad som sker innan den partiella vyn renderas. De två metoderna som har tillkommit är Html.Action() och Html.RenderAction().

Det som sker när vi använder dessa metoder är att vi istället för att anropa en user control direkt, går igenom en Action-metod.

För att testa funktionaliteten så behöver vi först en modell kallad Customer.

namespace Mvc2Beta.Models
{
    public class Customer
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

Sedan så behöver vi en partiell vy som visar ett eventuellt inskickat namn. Den skall vara hårt typad mot Customer-klassen.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Mvc2Beta.Models.Customer>" %>
Hej, <%= Model.Name %>!

Nu har vi det som krävs för att vi ska kunna anropa den partiella vyn. Nästa steg blir att implementera de olika metoder som kan användas för att anropa den.

De tre sätt som vi ska hämta in vyn på är genom Html.RenderPartial(), Html.Action() och Html.RenderAction().

Vi börjar med att lägga in det som behövs i vyn där de skall visas:

<ul>
    <li>
        RenderPartial: <% Html.RenderPartial("Name", new Mvc2Beta.Models.Customer() {Id = 1, Name = "Mikael"}); %>
    </li>
    <li>
        RenderAction: <% Html.RenderAction("Name", new Mvc2Beta.Models.Customer() { Id = 1, Name = "Mikael" }); %>
    </li>
    <li>
        Action: <%= Html.Action("Name", new Mvc2Beta.Models.Customer() { Id = 1, Name = "Mikael" }) %>
    </li>
</ul>

Vi kan se att RenderAction fungerar på samma sätt som RenderPartial i vyn. Action returnerar däremot en sträng som vi antingen kan skriva ut direkt, eller som vi kan använda på annat sätt.

Då Action och RenderAction inte går direkt mot den partiella vyn, utan mot en Action-metod så kommer vi att få ett fel om vi kör koden nu. Det vi behöver göra är att skapa en metod vid namn ”Name” och som tar emot ett Customer-objekt som vi vill vidarebefordra till vår partiella vy.

Vi lägger det här i controller-klassen:

public ActionResult Name(Customer customer)
{
    return PartialView(customer);
}

Vi behöver inte ta emot ett Customer-objekt som parameter i metoden, men jag gör det nu för att det ska bli enklare att jämföra de olika varianterna. Däremot så måste vi returnera en PartialView med ett Customer-objekt.

Om vi nu kör sidan så kan vi se att alla tre metoder returnerar samma vy med samma information. Skillnaden ligger i hur vi anropar den.

Det finns nu alltså tre olika metoder för tre olika scenarion.

Vill du snabbt och enkelt rendera en partiell vy med eller utan en modell?

- Använd Html.RenderPartial().

Vill du rendera en partiell vy, men kunna påverka flödet i en Action-metod?

- Använd Html.RenderAction().

Vill du ta emot en partiell vy i en sträng efter att ha haft möjligheten att påverka flödet i en Action-metod?

- Använd Html.Action().

Det finns ingen metod för alla scenarion, utan det gäller att välja den som passar bäst för det enskilda scenariot.

No Comments