How to get whole viewmodel in taghelper process method?
Asked Answered
H

2

5

Is it possible to get the whole view model in tag helper Process method (.NET Core MVC)?

Humpy answered 23/7, 2019 at 13:2 Comment(0)
V
2

Everything passed to the tag helper is done via attributes. If you want the whole view model, then you'd simply so domething like:

<mytag model="@Model" />

And then you'd need a property on your tag helper to bind this to like:

public MyViewModel Model { get; set; }

The name of the attribute corresponds to the name of the property. There's nothing special about "model" here.

However, the utility of that is going to be limited. Tag helpers are intended to be somewhat generic. That's the point: encapsulating reusable logic. If you tie it to a particular view model class (based on the property), then it will only work with that particular view model. The only way to make it more generic would be to use a base class or to literally type it as object, so that anything could be passed. However, with a base class, 1) you need to have every view model inherit from this base class and 2) even then, you'd only be able to use properties on the base class. With object, you wouldn't really be able to reference any properties unless you downcast it to a particular view model class first. While that would allow you to handle any scenario, in principle, you'd be forced to have long blocks of switch or if statements in your tag helper to conditionally handle different scenarios.

Long and short, it's not a great idea for many reasons to pass the whole model. The tag helper should have one specific purpose, and you should only pass things that are specifically needed by it, which also allows you to be explicit about those needs.

If you're looking for something to handle a whole model, you're more likely looking for a partial view or view component, rather than a tag helper.

Voluble answered 23/7, 2019 at 13:18 Comment(0)
C
4

The viewmodel is actually available if you bind first the for element as :

[HtmlAttributeName("asp-for")]
public ModelExpression For { get; set; }

Then you can access it in your tag helper Process or ProcessAsync through:

For.ModelExplorer.Container.Model

Cybill answered 28/2, 2021 at 5:21 Comment(1)
Note: You can do this with any property of your tagHelper, not only "asp-for"Leonilaleonine
V
2

Everything passed to the tag helper is done via attributes. If you want the whole view model, then you'd simply so domething like:

<mytag model="@Model" />

And then you'd need a property on your tag helper to bind this to like:

public MyViewModel Model { get; set; }

The name of the attribute corresponds to the name of the property. There's nothing special about "model" here.

However, the utility of that is going to be limited. Tag helpers are intended to be somewhat generic. That's the point: encapsulating reusable logic. If you tie it to a particular view model class (based on the property), then it will only work with that particular view model. The only way to make it more generic would be to use a base class or to literally type it as object, so that anything could be passed. However, with a base class, 1) you need to have every view model inherit from this base class and 2) even then, you'd only be able to use properties on the base class. With object, you wouldn't really be able to reference any properties unless you downcast it to a particular view model class first. While that would allow you to handle any scenario, in principle, you'd be forced to have long blocks of switch or if statements in your tag helper to conditionally handle different scenarios.

Long and short, it's not a great idea for many reasons to pass the whole model. The tag helper should have one specific purpose, and you should only pass things that are specifically needed by it, which also allows you to be explicit about those needs.

If you're looking for something to handle a whole model, you're more likely looking for a partial view or view component, rather than a tag helper.

Voluble answered 23/7, 2019 at 13:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.