Search code examples
c#asp.netasp.net-mvcasp.net-corerazor

htmlFieldPrefix breaks names outside partial view


I have a view, which contains this snippet:

@{Html.RenderPartial("~/Features/MainPage/_MyPartialView.cshtml", Model.PartialViewViewModel); }
@Html.HiddenFor(x => x.Model.SomeProperty)

And my partial view starts with

@model PartialViewViewModel
@{
  Html.ViewData.TemplateInfo.HtmlFieldPrefix = "PartialViewViewModel";
}

The issue is, that HiddenProperty's name from the view is generated using partial view's prefix too. It's "PartialViewViewModel.SomeProperty" instead of "SomeProperty". Switching hiddenfor and partial view in places fixes the problem (name becomes "SomeProperty"). Is there a way to isolate HtmlFieldPrefix just for the partial view?


Solution

  • You can try to add

    @{
        Html.ViewData.TemplateInfo.HtmlFieldPrefix = "";
    }
    

    into the view you contains the Partial view.

    Here is a demo:

    Models:

    public class ParentModel
        {
            public PartialViewViewModel PartialViewViewModel { get; set; }
            public string SomeProperty { get; set; }
        }
    public class PartialViewViewModel
        {
            public int Id { get; set; }
        }
    

    _MyPartialView.cshtml:

    @{
        Html.ViewData.TemplateInfo.HtmlFieldPrefix = "PartialViewViewModel";
    }
    @Html.TextBoxFor(m=>m.Id)
    

    View Containing _MyPartialView:

    @{
        Html.ViewData.TemplateInfo.HtmlFieldPrefix = "";
    }
    @model ParentModel
    @{Html.RenderPartial("_MyPartialView.cshtml", Model.PartialViewViewModel); }
    @Html.HiddenFor(x => x.SomeProperty)
    

    result: enter image description here