Joshua Frank
Joshua Frank

Reputation: 13838

What is the right design pattern for custom template types in ASP.NET MVC?

Here's my situation: I've got a number of specialized object types in my application, and I'm following the standard convention for displaying them with custom templates in the /Shared/DisplayTemplates folder, and editing them with templates in /Shared/EditorTemplates. But I also want to be able to display a custom filter template for each type, so I'd like to add a /Shared/FilterTemplates folder, and implement my own @Html.FilterFor method, so that showing a Filter template is exactly like showing a Display or Editor template.

Does this seem like the best way to handle this situation, or is there a more correct/elegant way to do this in MVC? Thanks in advance.

Upvotes: 0

Views: 143

Answers (2)

Erik Funkenbusch
Erik Funkenbusch

Reputation: 93444

I think you misunderstand how Templates work. Templates do not make sense in the context you are describing.

Templates work on a SINGLE data item (although that data item can contain multiple data items, which in turn have their own templates).

The concept of a Filter is to control multiple data items, thus they do not map well to a template.

What you could do is create a DisplayTemplate for your collection class that adds filtering, thus no need to create a custom type of template. Just use DisplayTemplates.

Upvotes: 0

Jonas Stensved
Jonas Stensved

Reputation: 15286

I'm always using EditorTemplates when data is sent back to server. I assume the user can submit the filter to the server to perform the actual filtering.

When creating filters I prefer to create a model for the filter like:

public class UserListFilterModel
{
    public string Username { get; set; }
    public bool IsEnabled { get; set; }
}

The view for UserListFilterModel goes into EditorTemplates/UserListFilterModel.ascx.

And then add it as a property on my view model for the page.

public class MyPageViewModel
{
    public UserListFilterModel Filter { get; set; }
}

Then I add the filter model to the model for the page and displays it like this:

<%= Html.EditorFor(x => x.Filter)%>

You are probably wrapping the filter in a form to allow the user to submit the values so I think it belongs in EditorTemplates. The users is in fact editing the filter model.

(If you really want to separate them ing you could use the UIHintAttribute but I wouldn't)

Edit: I added some sample code.

Upvotes: 1

Related Questions