我有一个关于在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的事实。
答案 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; }
- 因此更明显的是您的属性是集合而不是单个对象