MVC 6 VNext how to set HtmlFieldPrefix?

此生再无相见时 提交于 2019-12-23 23:50:43

问题


My view is divided into partial views. Hence, at the time of submission my model isn't reconstructed correctly.

The page view displays employee data, where Employee.Contactinfo is the model of _contactInfo partial view, which again has a partial view _phoneInfo to render phone info having model Employee.ContactInfo.PhoneInfo.

Now the problem is with the name of properties. Employee.ContactInfo.PhoneInfo.Contact1 at the time of rendering has name "Contact1", hence at the time of submission the model isn't created appropriately, I get primitive data of Employee but complex type like ContactInfo is null.

I think the solution is to add the prefix at the time of rendering the partial view. How can I perform the following in MVC 6?

employee.cshtml

@model Employee
<% Html.RenderPartial("_conctactInfo", Model.ContactInfo, new ViewDataDictionary
{
    TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "ContactInfo" }
})
%>

_contactInfo.cshtml

@model ContactInfo
<% Html.RenderPartial("_phoneInfo", Model.PhoneInfo, new ViewDataDictionary
{
    TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "PhoneInfo" }
})
%>

_phoneInfo.cshtml

@model PhoneInfo
<input asp-for="@Model.Contact1" />

回答1:


Here is the solution,

namespace Website1.Extensions
{
    public static class HtmlHelper
    {
        public static IHtmlContent Partial(this IHtmlHelper htmlHelper, string partialViewName, object model, string prefix)
        {
            var viewData = new ViewDataDictionary(htmlHelper.ViewData);
            var htmlPrefix = viewData.TemplateInfo.HtmlFieldPrefix;
            viewData.TemplateInfo.HtmlFieldPrefix += !Equals(htmlPrefix, string.Empty) ? $".{prefix}" : prefix;
            return htmlHelper.Partial(partialViewName, model, viewData);
        }

        public static Task<IHtmlContent> PartialAsync(this IHtmlHelper htmlHelper, string partialViewName, object model, string prefix)
        {
            var viewData = new ViewDataDictionary(htmlHelper.ViewData);
            var htmlPrefix = viewData.TemplateInfo.HtmlFieldPrefix;
            viewData.TemplateInfo.HtmlFieldPrefix += !Equals(htmlPrefix, string.Empty) ? $".{prefix}" : prefix;
            return htmlHelper.PartialAsync(partialViewName, model, viewData);
        }
    }
}

employee.cshtml

@using Website1.Extensions;
@model Employee
@Html.Partial("_contactInfo", Model.ContactInfo, nameof(Model.ContactInfo))

_contactInfo.cshtml

@using Website1.Extensions;
@model ContactInfo
@Html.Partial("_phoneInfo", Model.PhoneInfo, nameof(Model.PhoneInfo))

_phoneInfo.cshtml

@model PhoneInfo
<input asp-for="@Model.Contact1" />



回答2:


If you only need this once this would be the quick solution for the _contactInfo partial view

employee.cshtml

   @{
        var viewData = new ViewDataDictionary(ViewData);
        viewData.TemplateInfo.HtmlFieldPrefix = "ContactInfo";
    }

    <partial name="_conctactInfo" model="Model.ContactInfo" view-data="@viewData"/>


来源:https://stackoverflow.com/questions/39145109/mvc-6-vnext-how-to-set-htmlfieldprefix

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!