我有一个复杂的类,代码如下:
public class Person
{
public Address address;
public Address GetAddress { get; set; } //Property
// Constructor
public Person() { address = new Address(); }
}
public class Address
{
// Properties
public String Street { get; set; }
public String City { get; set; }
// Constructor
public Address() { Street = "Madison"; City = "NY"; }
}
我的行动方法(修剪版)如下:
public ActionResult Index()
{
Person person = new Person();
return View(person);
}
[HttpPost]
public ActionResult Index(Person person)
{
ViewBag.City = person.address.City;
return View();
}
从我的View / .cshtml文件中: 我可以通过Model的实例或属性访问地址的值。
当我第一次调出视图时:
如果我通过实例@Html.TextBoxFor(m => m.address.Street)
访问值 - 我得到类构造函数中设置的值 - 麦迪逊和纽约。
如果我通过属性访问它 - @Html.TextBoxFor(m => m.GetAddress.Street)
,我会得到空值。
在我的控制器操作方法中public ActionResult Index(Person person)
:
如果我使用实例 - person.address.street/city
访问值,我会得到分配给我的模型的旧值 - 麦迪逊和纽约。
如果我使用属性 - person.GetAddress.Street
访问值,则会获得从View输入的更新值。
提前致谢。
答案 0 :(得分:1)
如果我通过属性访问它 - @ Html.TextBoxFor(m => m.GetAddress.Street),我得到空白值
这是因为您从未设置Person.GetAddress
属性(属性的奇怪名称,听起来应该是一种方法)。因此,您将获得空白值。
如果我使用property - person.GetAddress.Street访问值,我会获得从View
输入的更新值
听起来你有Html.TextBoxFor(m => m.GetAddress.Street)
,在这种情况下你会填充该属性值。然后当您发布POST时,您将拉出包含输入数据的person.GetAddress.Street
。
答案 1 :(得分:0)
GetAddress
给你一个空白文本框的原因是因为它没有设置。看起来您可能希望实际上为您提供Person
的地址,因此您可以像这样更改它:
GetAddress
{
get { return address; }
}
或者,只需将address
字段更改为属性:
public Address address { get; set; }
如果您愿意,这使您能够完全摆脱GetAddress
。
GetAddress
,则会导致它存储您传入的值。因为,在您的代码示例中,GetAddress
是一个独立的属性,不是&#39 ; t实际上附加到address
类的Person
字段,然后将文本框绑定到它只会更改GetAddress
属性的值而不是实际的address
你期望的财产。您可能会发现我对问题1的替代解决方案可以为您解决此问题。答案 2 :(得分:0)
您的财产未自动链接到您的字段。 GetAddress { get; set; }
自动生成一个字段,该属性充当访问它们的语法糖。如果您只想包裹address
,可以执行以下操作:
public Address GetAddress
{
get
{
return address;
}
set
{
address = value;
}
}
或者,你可以摆脱你的领域,并做(给你公共的吸气者和设定者):
public Address Address { get; set; }