C# 在视图上表示复杂类型

C# 在视图上表示复杂类型,c#,lambda,asp.net-mvc-5,C#,Lambda,Asp.net Mvc 5,我有一个关于在视图上表示复杂视图的问题。因为我的代码已经很复杂了,所以为了寻找答案,我提出了一个简单的模型 将此视为我的模型类和复杂类型 public class Person { public string FirstName { get; set; } public string Surname { get; set; } public string Phone { get; set; } public List<Address> Address

我有一个关于在视图上表示复杂视图的问题。因为我的代码已经很复杂了,所以为了寻找答案,我提出了一个简单的模型

将此视为我的模型类和复杂类型

public class Person
{
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public string Phone { get; set; }
    public List<Address> Address {get; set;}
}

[ComplexType]
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
}
我现在有一个问题,比如说地址“Street property”的文本框。我不想硬编码到视图中,我更喜欢使用Lambda表达式来获取一个文本框,比如street、city和state。虽然这种语法是错误的,但下面是我试图实现的

@Html.TextBoxFor(model => model.Address.Street, new { @class = "Name" })
或者C#中的一些合法的东西,将我从输入控件的名称直接输入助手方法中抽象出来。这是因为在为我的项目使用模型绑定时,我不希望在模型更改后返回视图以硬编码输入名称

更新
地址是一种列表类型。我已经更新了代码,以反映Address是代码中类型Address的列表这一事实。

使用MVC,您可以将视图设置为期望使用特定的模型。如果你这样做,你就可以在模型上获得完整的智能感知,不管它有多复杂。我更喜欢这样做,而不是将所有模型简化为字符串,以便“更容易”绑定

下面是我在强类型视图上找到的一篇快速帖子:


查看是否为您提供了一些进展方面的想法。

您可以对
地址的类型使用自定义
编辑器或模板,也可以对
循环使用

/Views/Shared/EditorTemplates/Address.cshtml

@model yourAssembly.Address
@Html.TextBoxFor(m => m.Street, new { @class = "Name" })
@Html.TextBoxFor(m => m.City, new { @class = "Name" })
....
在主要观点中

@Html.EditorFor(m => m.Address)
for(int i = 0; i < Model.Address.Count; i++)
{
    @Html.TextBoxFor(m => m.Address[i].Street, new { @class = "Name" })
    @Html.TextBoxFor(m => m.Address[i].City, new { @class = "Name" })
    ....
}
或者在主视图中为
循环使用

@Html.EditorFor(m => m.Address)
for(int i = 0; i < Model.Address.Count; i++)
{
    @Html.TextBoxFor(m => m.Address[i].Street, new { @class = "Name" })
    @Html.TextBoxFor(m => m.Address[i].City, new { @class = "Name" })
    ....
}
for(int i=0;im.Address[i].Street,new{@class=“Name”})
@Html.TextBoxFor(m=>m.Address[i].City,new{@class=“Name”})
....
}
这两个选项都将生成正确的名称属性,例如,您的集合将在回发时绑定

<input name="Address[0].Street" .../>
<input name="Address[1].Street" .../>


旁注:建议对集合使用复数命名-
公共列表地址{get;set;}
-这样更明显的是,您的属性是一个集合而不是单个对象

您是否尝试过
@Html.EditorForModel
?请参阅。您使用
Html.TextBoxFor(m=>m.Address.Street)
给出的示例在我看来是有效的。这对你不管用吗?也许我误解了你的问题。
Html.TextBoxFor(m=>m.Address.Street)
不适合我。我对我的问题进行了编辑,以反映我认为是什么问题。让地址为列表我已经编辑了代码,地址是我的模型类中的列表类型。我正在创建视图中使用该代码,因此
model.Address.Count
不适用。我想使用我在某个地方的帖子中看到的第一个建议,但编译器抱怨说,因为视图中有两个@model语句,为什么有两个@model语句?您所需要的只是
@model yoursassembly.Person
,不确定“model.Address.Count”的含义是否适用?如果要创建一个新人,则需要向收藏中至少添加一个
地址
对象,以便对其进行编辑。如果您想在视图中动态添加多个
地址
对象,那么您需要一种涉及javascript/jquery的完全不同的方法(但在您的问题中没有提到这一点)。我将有两个@model语句,因为我已经在顶部有了
@model yoursassembly.Person
。我也想对地址类型使用lambda表达式功能,但我无法在视图中引用
@model yoursassembly.Address
。这就是它如何产生两个@model语句的原因。视图中不包括
@model Address
<代码>地址
已经是
个人
(或者至少是
列表
的属性)您需要阅读我的最后一条评论。