Я думаю, что вы должны создать ActionFilter и применить его на своих контроллерах.
Создайте фильтр действий, подобный этому
public class DataForMasterPageAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//initiate your repository
var catRepository = ...;
//then create the viewdata like so
filterContext.Controller.ViewData["Categorias"] = new SelectList(catRepository.FindAllCategorias().AsEnumerable(), "id", "nome", 3);
}
}
Затем примените его к контроллеру, и он будет доступен для всех действий. Вот так;
[DataForMasterPage]
public class CategoriaController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
}
При частичном просмотре вы просто вызываете ViewData как обычно, не нужно ничего менять
<div class="editor-label">
<%= Html.LabelFor(model => model.categoria_id) %>
</div>
<div class="editor-field">
<%= Html.DropDownListFor(model => model.categoria_id, (SelectList)ViewData["Categorias"], "--Selecciona um--")%>
<%= Html.ValidationMessageFor(model => model.categoria_id) %>
</div>
Может иметь проблемы с производительностью, но это один из самых простых способов избежать установки ViewData для каждого метода.