Calling all developers! We invite you to provide your input on Feature Experimentation by completing this brief survey.
Calling all developers! We invite you to provide your input on Feature Experimentation by completing this brief survey.
In a block controller you can get the view data from the "main" view (a block controller is called through a child action call). So you could have a view like eg:
@Html.PropertyFor(m => m.CurrentPage.MyBlock, new { View = "Condensed" })
then in the block controller you could check if the parent context has a value for the property (View in this case) as:
public override ActionResult Index(TestBlock currentBlock)
{
var parentContext = this.RouteData.DataTokens["ParentActionViewContext"] as ViewContext;
if (parentContext != null)
{
var viewName = parentContext.ViewData["View"] as string;
if (!String.IsNullOrEmpty(viewName))
{
return PartialView(viewName, currentBlock);
}
}
return PartialView(currentBlock);
}
Thanks,
Yes, I figured I could pass the viewdata myself. I was hoping for a more "built-in" way of doing it, but this will be good enough!
Another question for you guys!
Say I have defined a NewsBlock which has its own NewsBlockController. This controller fetches some pages, does some logic etc and maps the data to a simple view model, NewsViewModel, which is rendered in a Views/NewsBlock/Index.cshtml (typed to NewsViewModel). This works fine, everything as expected.
Now, on some pages (where I have the NewsBlock as a local property), I would like render the block slightly different, using another template. All I want to do is to trigger the use of another .cshtml-file (but still go via the same controller and view model). I thought I could solve this by introducing a tag like this:
@Html.PropertyFor(m => m.NewsBlock, new { Tag = "Condensed" })
and register another template (I'm using the TemplateCoordinator class as in the Alloy project) something like this:
...
viewTemplateModelRegistrator.Add(typeof(NewsBlock), new TemplateModel
{
Name = "NewsCondensed,
Inherited = true,
Tags = new[] { "Condensed" },
AvailableWithoutTag = false,
Path = "~/Views/NewsBlock/Condensed.cshtml"
});
But obviously, this isn't quite right! First of all, if I trigger this specific template (by using the "Condensed" tag), it wouldn't involve the NewsBlockController, it goes directly for partial view. Secondly, the Condensed.cshtml expects a NewsViewModel, not a NewsBlock type (resulting in an exception).
Any suggestions how to solve this? Do I need to duplicate the controller (and decorate it with another tag using the TemplateDescriptor attribute)? :/