gpt4 book ai didi

asp.net-mvc - 在 ASP.NET MVC 3 中覆盖基本 View 模型的属性

转载 作者:行者123 更新时间:2023-12-04 12:55:52 26 4
gpt4 key购买 nike

我有一个由两个不同页面共享的 View 模型。 View 模型非常相似,除了一个属性:地址。 View 模型包含名称和位置字段。但是,客户 View 的地址标签应为:客户地址,员工 View 的地址标签应为:员工地址。它们还将显示不同的错误消息。

这是我要完成的简化版本:

public class BaseLocation
{
[Display(Name="Your Name")]
public string Name {get;set;}

public virtual string Address {get;set;}
}

public class CustomerLocation : BaseLocation
{
[Display(Name="Customer Address")]
public override string Address {get;set;}
}

public class EmployeeLocation : BaseLocation
{
[Display(Name="Employee Address")]
public override string Address {get;set;}
}

然后我为基本位置创建了一个部分,如下所示:
@model BaseLocation
***ASP.NET MVC Helpers here: labels, text, validation, etc.

最后,在 Customer 和 Employee 页面中,我将调用 partial 并将其发送为子类类型。
Customer.cshtml
@model CustomerLocation
@Html.Render("_BaseLocation", Model)


Employee.cshtml
@model EmployeeLocation
@Html.Render("_BaseLocation", Model)

结果是我看不到特定类型的数据属性。例如,在客户页面中,我会得到一个“地址”标签,而不是“客户地址”。

我宁愿不为每个特定类型创建两个具有相同数据的部分,因为共享 View 模型中的一个属性应该具有不同的标签和错误消息。解决这个问题的最佳方法是什么?谢谢。

最佳答案

由于 View 继承的工作方式以及模型的定义方式,参数传递到类似 LabelForTextBoxFor使用类中定义的模型类型。在您的情况下,它将始终是 BaseLocation这就是为什么它没有被覆盖。

您不一定要为您的类(class)创建局部 View ,但您必须创建两个 View ,一个用于客户,一个用于员工。由于您已经有两个特定于每种类型的 View ,您只需创建另一个位置 View 或将基本位置 View 合并到它的父 View 中。

Customer.cshtml
@model CustomerLocation
@Html.Render("_CustomerBaseLocation", Model)


Employee.cshtml
@model EmployeeLocation
@Html.Render("_EmployeeBaseLocation", Model)

我绝对理解您的问题,因为您只想更改一个 View ,并且您可能已经使用 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)

编写一个自定义扩展方法来做到这一点是我能想到的

关于asp.net-mvc - 在 ASP.NET MVC 3 中覆盖基本 View 模型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com