it-swarm-pt.tech

Passando dados para a Página Mestra no ASP.NET MVC

Qual é a sua maneira de passar dados para a Master Page (usando o ASP.NET MVC) sem violar as regras do MVC?

Pessoalmente, prefiro codificar o controlador abstrato (controlador base) ou a classe base que é passada para todas as visualizações.

102
Łukasz Sowa

Se você preferir que suas visualizações tenham classes de dados de visualização com tipos fortes, isso pode funcionar para você. Outras soluções são provavelmente mais corretas mas este é um bom equilíbrio entre design e praticidade IMHO.

A página mestre possui uma classe de dados de exibição fortemente tipada, contendo apenas informações relevantes para ela:

public class MasterViewData
{
    public ICollection<string> Navigation { get; set; }
}

Cada visualização que usa essa página mestre adota uma classe de dados de exibição fortemente tipada, contendo suas informações e derivando dos dados de exibição de páginas mestre:

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

Como não quero que os controladores individuais saibam nada sobre como reunir os dados das páginas mestras, encapsulo essa lógica em uma fábrica que é passada para cada controlador:

public interface IViewDataFactory
{
    T Create<T>()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create<ProductViewData>();

        viewData.Name = "My product";
        viewData.Price = 9.95;

        return View("Index", viewData);
    }
}

A herança corresponde ao mestre para visualizar bem o relacionamento, mas, quando se trata de renderizar controles parciais/do usuário, comporemos seus dados de exibição nas páginas, por exemplo.

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
    public SubViewData SubViewData { get; set; }
}

<% Html.RenderPartial("Sub", Model.SubViewData); %>

Este é apenas um código de exemplo e não se destina a compilar como está. Projetado para o ASP.Net MVC 1.0.

77
Generic Error

Prefiro dividir as partes controladas por dados da visualização principal em parciais e renderizá-las usando Html.RenderAction . Isso tem várias vantagens distintas sobre a abordagem de herança do modelo de exibição popular:

  1. Os dados da vista mestre são completamente dissociados dos modelos de vista "regulares". Trata-se de composição sobre herança e resulta em um sistema mais frouxamente acoplado, mais fácil de mudar.
  2. Os modelos de vista principal são construídos por uma ação do controlador completamente separada. Ações "regulares" não precisam se preocupar com isso, e não há necessidade de uma fábrica de dados de exibição, o que parece muito complicado para o meu gosto.
  3. Se você usar uma ferramenta como AutoMapper para mapear seu domínio para seus modelos de visualização, será mais fácil configurá-lo porque seus modelos de visualização se parecerão mais com seus modelos de domínio quando não herdarem dados da visualização principal.
  4. Com métodos de ação separados para dados mestre, você pode aplicar facilmente o cache de saída a determinadas regiões da página. Geralmente, as visualizações principais contêm dados que são alterados com menos frequência do que o conteúdo da página principal.
59
Todd Menier

[~ # ~] edite [~ # ~]

Erro genérico forneceu uma resposta melhor abaixo. Por favor, leia!

Resposta original

A Microsoft realmente postou uma entrada em a maneira "oficial" para lidar com isso. Isso fornece um passo a passo com uma explicação de seu raciocínio.

Em resumo, eles recomendam o uso de uma classe abstrata de controlador, mas veja por si mesmo.

20
Michael La Voie

Controladores abstratos são uma boa ideia e não encontrei uma maneira melhor. Também estou interessado em ver o que outras pessoas fizeram.

7
Ian P
3
David Negron

Acho que um pai comum para todos os objetos de modelo que você passa para a exibição é excepcionalmente útil.

Sempre haverá algumas propriedades comuns do modelo entre as páginas.

2
Matt Mitchell

Eu acho que outra boa maneira poderia ser criar uma interface para exibição com alguma propriedade como ParentView de alguma interface, para que você possa usá-la para controles que precisam de uma referência à página (controle pai) e para visualizações principais que devem ser acessadas a partir de pontos de vista.

0
dimarzionist

As outras soluções não têm elegância e demoram muito. Peço desculpas por fazer essa coisa muito triste e empobrecida quase um ano inteiro depois:

<script runat="server" type="text/C#">
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        MasterModel = SiteMasterViewData.Get(this.Context);
    }

    protected SiteMasterViewData MasterModel;
</script>

Tão claramente que eu tenho esse método estático Get () no SiteMasterViewData que retorna SiteMasterViewData.

0
rasx

O objeto Request.Params é mutável. É muito fácil adicionar valores escalares a ele como parte do ciclo de processamento de solicitações. Da perspectiva da exibição, essas informações poderiam ter sido fornecidas no QueryString ou no FORM POST. hth

0
mtutty