使用实例或属性访问值

时间:2015-09-03 21:16:15

标签: c# asp.net-mvc asp.net-mvc-4

我有一个复杂的类,代码如下:

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的实例或属性访问地址的值。

  1. 当我第一次调出视图时:
    如果我通过实例@Html.TextBoxFor(m => m.address.Street)访问值 - 我得到类构造函数中设置的值 - 麦迪逊和纽约。 如果我通过属性访问它 - @Html.TextBoxFor(m => m.GetAddress.Street),我会得到空值。

  2. 在我的控制器操作方法中public ActionResult Index(Person person): 如果我使用实例 - person.address.street/city访问值,我会得到分配给我的模型的旧值 - 麦迪逊和纽约。 如果我使用属性 - person.GetAddress.Street访问值,则会获得从View输入的更新值。

  3. 提前致谢。

3 个答案:

答案 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)

  1. GetAddress给你一个空白文本框的原因是因为它没有设置。看起来您可能希望实际上为您提供Person的地址,因此您可以像这样更改它:

    GetAddress
    {
        get { return address; } 
    }
    
  2. 或者,只需将address字段更改为属性:

    public Address address { get; set; }
    

    如果您愿意,这使您能够完全摆脱GetAddress

    1. 如果您使用文本框设置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; }