Qual é a sua maneira de passar dados para a página mestra (usando ASP.NET MVC) sem quebrar as regras do MVC?
Pessoalmente, prefiro codificar controlador abstrato (controlador de base) ou classe base que é passada para todas as visualizações.
Qual é a sua maneira de passar dados para a página mestra (usando ASP.NET MVC) sem quebrar as regras do MVC?
Pessoalmente, prefiro codificar controlador abstrato (controlador de base) ou classe base que é passada para todas as visualizações.
Respostas:
Se você preferir que suas visualizações tenham classes de dados de visualização fortemente tipadas, 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 mestra tem uma classe de dados de visualização fortemente tipada contendo apenas informações relevantes a ela:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Cada visualização que usa essa página mestra tem uma classe de dados de visualização fortemente tipada contendo suas informações e derivando dos dados de visualização das páginas mestras:
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 bem ao relacionamento mestre para visualizar, mas quando se trata de renderizar parciais / controles de usuário, irei compor seus dados de visualização nos dados de visualização de 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 ASP.Net MVC 1.0.
Eu prefiro quebrar as partes orientadas por dados da visualização mestre em parciais e renderizá-las usando Html.RenderAction . Isso tem várias vantagens distintas sobre a abordagem de herança de modelo de visão popular:
EDITAR
Erro genérico forneceu uma resposta melhor abaixo. Por favor, leia!
Resposta Original
A Microsoft publicou uma entrada sobre a maneira "oficial" de lidar com isso. Isso fornece um passo a passo com uma explicação de seu raciocínio.
Resumindo, eles recomendam o uso de uma classe de controlador abstrata, mas veja por si mesmo.
Eu fiz algumas pesquisas e encontrei esses dois sites. Talvez eles pudessem ajudar.
ASP.NET MVC Dica # 31 - Passando dados para páginas mestras e controles de usuário
Acho que um pai comum para todos os objetos de modelo que você passa para a visualização é excepcionalmente útil.
Sempre haverá a tendência de haver algumas propriedades de modelo comuns entre as páginas.
O objeto Request.Params é mutável. É muito fácil adicionar valores escalares a ele como parte do ciclo de processamento da solicitação. Do ponto de vista da visão, essas informações podem ter sido fornecidas no QueryString ou no FORM POST. hth
Acho que outra boa maneira poderia ser criar uma interface para visualização com alguma propriedade, como ParentView de alguma interface, para que você possa usá-la tanto para controles que precisam de uma referência à página (controle pai) quanto para visualizações principais que devem ser acessadas de Visualizações.
As outras soluções carecem de elegância e demoram muito. Peço desculpas por fazer essa coisa tão 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>
Portanto, claramente tenho este método estático Get () em SiteMasterViewData que retorna SiteMasterViewData.