Из-за того, как работает наследование представлений и как определяется модель, параметр, передаваемый во что-то вроде LabelFor
и TextBoxFor
, использует тип модели, определенный в классе.В вашем случае он всегда будет BaseLocation
, поэтому он не переопределяется.
Вам не обязательно создавать партиалы для вашего класса, но вам нужно будет создать два представления: одно для клиента, а другое для сотрудника.Поскольку у вас уже есть два вида, специфичных для каждого типа, вам просто нужно создать другой вид местоположения или объединить базовый вид с его родителем.
Customer.cshtml
@model CustomerLocation
@Html.Render("_CustomerBaseLocation", Model)
Employee.cshtml
@model EmployeeLocation
@Html.Render("_EmployeeBaseLocation", Model)
Я определенно понимаю вашу проблему, поскольку вы хотите изменить только одно представлениеи у вас может быть несколько подобных ситуаций уже с BaseLocation.
Вы могли бы сделать что-то подобное ...
public static IHtmlString LabelTextFor<TModel, TValue>(this HtmlHelper<TModel> html, object model, Expression<Func<TModel, TValue>> expression)
{
MemberExpression memberExpression = (MemberExpression)expression.Body;
var propertyName = memberExpression.Member is PropertyInfo ? memberExpression.Member.Name : null;
//no property name
if (string.IsNullOrWhiteSpace(propertyName)) return MvcHtmlString.Empty;
//get display text
string resolvedLabelText = null;
var displayattrib = model.GetType().GetProperty(propertyName)
.GetCustomAttributes(true)
.SingleOrDefault(f => f is DisplayAttribute)
as DisplayAttribute;
if (displayattrib != null) {
resolvedLabelText = displayattrib.Name;
}
if (String.IsNullOrEmpty(resolvedLabelText)) {
return MvcHtmlString.Empty;
}
TagBuilder tag = new TagBuilder("label");
tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName("")));
tag.SetInnerText(resolvedLabelText);
return new HtmlString(tag.ToString());
}
Тогда в вашем _BaseLocation.cshtml вы могли бы сделать такой вызов:
@Html.LabelTextFor(Model, m => m.Address)
Написание собственного метода расширения для этого - все, что я могу придумать