在 asp-for="object" 内的页面视图(模板)中投射对象

Posted

技术标签:

【中文标题】在 asp-for="object" 内的页面视图(模板)中投射对象【英文标题】:Cast an object in the page view (template) inside asp-for="object" 【发布时间】:2022-01-16 13:59:18 【问题描述】:

如何在页面视图的引号("") (asp-for="object") 内投射一个对象?

我有一个父类 Person 和两个子类 Student 和 Teacher。

variable:
Person person;

我想将其强制转换为子类......类似于:

asp-for="(Person)person.grade"

asp-for="((Person)person).grade"

但是这两个代码都不起作用。 如何在 asp-for 引号 ("") 中转换对象?

这是整个代码结构:

这是整个代码结构:

//父类

public abstract class Person

    //code


//child class

public class Teacher : Person

    //code
    public double Salary  get; set; 


//2nd child class

public class Student : Person

    //code
    public double Grade  get; set; 


//in WinForms I could access child classes components by down casting

public partial class FormSchool : Form

    //code
    Person Person;
    double grade = ((Student)Person).Grade;
    //code


//in razor pages as well in .cs files

public class IndexModel : PageModel

    //code
    [BindProperty]
    public Person Person  get; set; 
    //code


//but when it came to the page templates I got stuck how to do it inside of the asp-for=".." quotes

// the following code doesn't work
<select asp-for="((Student)Person).Grade" asp items="html.GetEnumSelectList<Grades>()"></select>
neither this:
<input asp-for="@(Person)Model.person.grade"/>

 

现在我只是使用子类来创建对象并将它们模型绑定到视图,但我想只拥有一个对象并将其转换为模板中的某些特定子类用途。

【问题讨论】:

由于您使用的是剃须刀页面,您将不得不发布整个页面和后面的整个代码。还有 Person、Student 和 Teacher 类代码。 为什么你需要把它转换成子类?你能分享你的模型吗?你在哪里使用asp-forasp-for将生成到id和name属性。如果你想绑定使用 asp-for 的数据,不需要强制转换。 【参考方案1】:
<input asp-for="...."/>

输入标签助手将ModelExpression 属性绑定到属性。 ModelExpressions 有点奇怪。从本质上讲,razor 编译器会将您的代码翻译成等价于;

 = ModelExpressionProvider.CreateModelExpression<TModel>(m => m.[your attribute text], ...);

但是,如果您的属性以 @ 开头,则不会插入前导 m.。换句话说,您应该能够做到以下几点;

<input asp-for="@(Person)Model.person.grade" />

至少应该编译。这是否能解决您的实际问题是另一回事。

【讨论】:

以上是关于在 asp-for="object" 内的页面视图(模板)中投射对象的主要内容,如果未能解决你的问题,请参考以下文章

Celery CRITICAL/MainProcess] 不可恢复的错误:AttributeError("'float' object has no attribute 'items'&qu

Angular Object 可能为“null”。 <span *ngIf="checkoutForm.get('emailAddr').hasError('required')&qu

ASP.NET Identity 2.0 Roles.IsUserInRole 给出 "Invalid object name 'dbo.aspnet_SchemaVersions'.&qu

Objective-C字符串连接

如何让 asp-for 输入标签助手生成驼峰命名法名称?

JavaScript:数组