Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can i call a "shared" editor template from within a "areas" editor template, for the same model?

I've got an editor template location in:

Areas/Posts/Views/Shared/EditorTemplates/Question.cshtml

I also have one in:

/Views/Shared/EditorTemplates/Question.cshtml

For both, the model is the same.

What i'm trying to do is within a View in the Posts area, call my editor template in the area, set some HTML and then bubble back up to the main shared editor template.

Here's the Posts EditorTemplate:

@model xxx.ViewModels.QuestionViewModel
@Html.Hidden("Id", (byte)Model.QuestionType)
@Html.EditorForModel()

But all it does it render out the hidden field, not the contents of the shared editor template.

If i get rid of the Posts editor template, the shared one is rendered properly.

I'm guessing MVC/Razor thinks this is recursive or something? Like im calling the same template?

Is there any way i can tell it to go to the shared one?

Essentially, i'm trying to re-use the HTML in the shared template, but inject some sneaky HTML of my own.

like image 563
RPM1984 Avatar asked Nov 17 '11 06:11

RPM1984


2 Answers

You can only have 1 template used at runtime for a given type. ASP.NET MVC first looks in areas shared templates folder and since it finds a corresponding template there it picks it up and it uses it. It then stops looking and the template you put in the main shared folder is never used. It's by design.

Is there any way i can tell it to go to the shared one?

Yes, you can explicitly specify the location of the template, but then it won't use the template in your areas folder:

@Html.EditorFor(x => x.Question, "~/Views/Shared/EditorTemplates/Question.cshtml")
like image 152
Darin Dimitrov Avatar answered Oct 14 '22 08:10

Darin Dimitrov


As the HTML markup for the shared editor template was very simple (just rendered a checkbox and a label), i abstracted the markup into a custom HTML helper, then called this from both the shared template and my areas template.

~/Areas/Posts/Views/Shared/EditorTemplates/Question.cshtml:

@model xxx.ViewModels.QuestionViewModel
@Html.Hidden("Id", (byte)Model.QuestionType)
@Html.QuestionCheckBoxForModel()
@Html.QuestionLabelForModel()

~/Views/Shared/EditorTemplates/Question.cshtml:

@model xxx.ViewModels.QuestionViewModel
@Html.QuestionCheckBoxForModel()
@Html.QuestionLabelForModel()
like image 30
RPM1984 Avatar answered Oct 14 '22 08:10

RPM1984