在视图上表示复杂类型

时间:2015-05-19 18:29:54

标签: c# lambda asp.net-mvc-5

我有一个关于在View上表示复杂视图的问题。由于我的代码已经很复杂,我想出了一个简单的模型来寻求答案。

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

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; }
}

例如,如果我想使用html助手来显示FirstName的TextBox,那么这将起作用

@Html.TextBoxFor(model => model.FirstName, new { @class = "Name" })

我现在遇到一个问题,就是说一个地址文本框&#39;街道财产。我不想将其硬编码到视图中,我更喜欢使用Lambda表达式来获取说街道,城市和州的文本框。虽然这种语法错误,但这就是我想要完成的事情

@Html.TextBoxFor(model => model.Address.Street, new { @class = "Name" })

或者在C#中合法的东西会让我从输入控件的名称输入到帮助方法中。这是因为在我的项目中使用模型绑定时,我不希望在模型更改后返回到我的视图以硬编码输入名称。

更新 地址是List类型。我已更新代码以反映Address在我的代码中是Address类型List的事实。

2 个答案:

答案 0 :(得分:1)

使用MVC,您可以设置视图以期望特定模型。如果你这样做,无论多么复杂,你都可以在模型上获得完整的智能感知。我更喜欢这种方法将所有模型降低到字符串,以使其更容易&#34;绑定。

以下是我在强类型视图中发现的快速帖子:http://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/strongly-typed-views-in-mvc/

看看能否为您提供有关进展的一些想法。

答案 1 :(得分:0)

您可以将自定义EditorTemplate用于Address类型,也可以使用for循环。

/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循环

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" })
    ....
}

这两个选项都会生成正确的名称属性,以便您的集合将在回发后绑定,例如

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

附注:建议您对集合使用复数命名 - public List<Address> Addresses { get; set; } - 因此更明显的是您的属性是集合而不是单个对象