ViewData not inheriting in partials - asp.net-mvc

I was trying to use a shared partial view to render when a particular listing page has no data. I wanted to use ViewData to pass information from the page into my listing control, which would then conditionally render the NoData partial view using the ViewData values.
I would like to be able to specify them in the view markup, not in the controller action, but when I add them in the view the don't seem to inherit down into child partial views (like the Nodata partial view). However, specifying them in the ViewData values in the controller actions works fine, the data is available all the way down...
Does anyone know why it behaves this way?

When rendering a partial you can also pass the ViewData.
<% Html.RenderPartial("NoData", ViewData); %>

<%Html.RenderPartial("partialViewName", "viewData", "model"); %>
it is a best practice to do the decision inside the controller, if you have a scenario to make a decision inside the view, separate them and call them inside the controller conditionally

Related

Given razor file, how do I differentiate whether it is a view or a partial view?

When I add a new ActionResult in controller like this
public ActionResult Step8(AddPropertyStep7ViewModel model)
{
return View();
}
I need to specify what kind of view I want to return.{View with layout, View , Partial View} I know that I want to return a file like this one below
This is the Step1.cshtml. How do I determine whether it is a view or a partial view of sth?
#using W.Resources
#model W.Models.ViewModels.Agent.AddPropertyStep1ViewModel
#{
Layout = "~/Areas/Agent/Views/Shared/_Layout.cshtml";
}
<div class="side site--dashboard"> ... <div>
#section scripts
{
<script> ... </script>
}
The basic way to define partial view is that it has Layout = null.
BUT
even if you have value in your Layout property, and you return the view like following from controller.
return PartialView("Your_view_name");
it will still get rendered as a partial view (it will not get wrapped in master page content).
As MVC works by Convention over configuration, the convention to define partial view is that the view name should start with "_" (_MyPartialView.cshtml)
As you mentioned in your edited question you need to specify which kind of view you want to return. i don't see need where you just need to return layout and nothing else. the solution i proposed above either to use return View() or return PartialView() from your action method will work perfectly and you can decide if you want to render page with master page or as partial view.
Views are views are views. The terms "layout" and "partial" just make it easier to talk about how a view is being used, but there's no functional difference between them. In other words, a layout is a view used as a layout. A partial is merely a view used as a partial. There's no way to just look at a view and know what type of view it is because it's entirely contextual.
That said, layouts are kind of an exception, since in order to truly function as a layout, they need #RenderBody() to be called somewhere. However, you could still use a view that didn't call this as a "layout" for another view. It just wouldn't actually render the view's HTML: all that would be returned is the layout's HTML.
There is a convention of prefixing layouts/partials with an underscore. However, that is merely a way to quickly see within the project tree that there's something special about a view file. It's not required and doesn't really give you any information about what exactly is special about the view.
That said, your question here isn't entirely clear. You say you want to specify what type of view is returned, presumably from your action. Well, you're already doing that, in effect. When you return View(), you're saying you want the view to be treated like a standard view. If you wanted to return a partial, you would have to return PartialView() instead. There's no way to specify that the returned view must utilize a layout, though.

How to pass data from child action to layout in ASP.NET MVC

I have a view which uses a layout, and also executes a child action.
The layout calls a partial which needs some data from the view's child action. Is there some way to pass the data up from the child action to it's parent view's layout?
I have tried solving this using sections, but it appears that sections can only be rendered in layout views.
In the end, I had the child action stuff the required data into the HttpContext. This was then read out by the view containing the child action, which used it to render a section in the layout.
I was concerned that the order of processing of the views would not be predictable (i.e. that I couldn't be sure that the data would be written to the HttpContext before being read from it), but it turns out the order of processing is entirely predictable.
In your child action, you can set up the data as data-*** attributes and then use JavaScript (or jQuery) to read them back in your partial.
E.g. child action:
<div id="somedata" data-customerid="123" data-reference="xyz">
</div>
Then in your partial:
<script>
....
var customerId = $("#somedata").data("customerid");
var reference = $("#somedata").data("reference");
</script>
Hope this helps

Partial with login and page logic

I have a navigation bar that I want to be a partial. The contents of the nav bar will vary slightly, like if the user is logged in or if you're on a certain page you might get an extra link.
How do I best deal with providing the data to the partial? Should I pass this in ViewData for every controller?
A list of options would help me the most, because likely I will have to utilize a few different techniques.
Make a model for it. Create a class NavModel which in its constructor gathers all the data it represents (friendly user name, current page, etc.) and publishes them as public properties. Then just bind the model to the view as usual. Oh, and avoid instantiating nav model directly in a view, instead create a controller action (called Nav) which instantiates the NavModel and returns the nav partial view. Mark that action as ChildActionOnlyAttribute so that it can't be requested by the client. Then use #Html.RenderAction in the view that needs to render the nav partial (usually a layout view).
I had the same problem sometime ago, when i have to show some menu to admin and some menu to super admin and some to others... What i did in that case. I made a an action returning partial view and rendered it on master page. The view was strongly typed. ( A class whose property representing roles of user.) so using that strongly typed class i wrote if and else if logic in my razor view..and that solved my problem....Hope this would help you.

Both create and list in the same view MVC4?

I am new to MVC4. I know basic CRUD functionality in MVC, but how can I achieve both create and list in the same view? Like after a user creates data the user will automatically be redirected to the same view and view the list of data.
You may use partial views to accomplish this. Create the create / edit pages the same way as you do and below the form you may render a partial view that would render the list with even edit / delete buttons.
Alternatively, you may pass both the form data (in case of edit) and the list data to a view to render there.
I would suggest you to use the partial views approach as it would simplify the view and the partial view can be reused on some other page also.
Please take this as a starting point and not as a follow-it-blindly solution.

HTML Helpers and Partial Views

If I have say a Partial View called MypartialView and I have a HTML Helper called "MyHTMLHelper" how can I return a partial view from the helper?
My requirement is that sometimes I'd like to render a PartialView on it's own and other times I'd like to render it with another partial view, or a slab of text or something.
So I thought I could create a helper that return both partial views, and a html helper that would return the partial view along with a slab of text.
is this best practice or should i instead create a partial view that has both partials in it and another that has a the partial view + the slab of text?
I'm not only looking for source but also the best practice according to what people are doing.
thanks.
I would use two Views:
-With 2 to partials
<% Html.RenderPartial("Partial1"); %>
<% Html.RenderPartial("Partial2"); %>
-The Partial and some text
Some Text
<% Html.RenderPartial("Partial1"); %>
I think the concept of DRY is still there, because at the end you still have all the code in one place, the Partial Views, and you just reference it from another two Views.
Doing it the other way will be complicated, and I don't think its really necessary to use another Helper Method to accomplish this.
Helpers seem to be designed to be reused a lot more heavily than partials so i'd suggest that if you think you will use the rendered result from the helper as much as you would with the alternative method (nested PV) then go with the helper.

Resources