2015-09-03 2 views
2

У меня есть сложный класс и код выглядит следующим образом:Значения доступа с использованием экземпляра или свойств

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

С моей точки зрения/.cshtml file: Я могу получить доступ к значениям для адреса через экземпляр модели или свойство.

  1. Когда воспитывает Вид на 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, я получаю обновленные значения, введенные из представления.

Заранее спасибо.

+0

' address' - это поле, а не свойство (оно не имеет 'get; set;'), поэтому привязка модели не может ** установить ** значение, поэтому вы устанавливаете только значения, которые были установлены в конструкторе –

ответ

1

Если я получить доступ к нему через свойство - @ Html.TextBoxFor (м => m.GetAddress.Street), я получаю пустые значения

Это потому, что вы никогда не устанавливая Person.GetAddressсвойство (нечетное имя для свойства, похоже, что это должен быть метод). Поэтому вы получаете пустое значение.

Если я получить доступ к значениям, используя свойство - person.GetAddress.Street, я получаю обновленные значения, которые были введены с видом

Похоже, у вас есть Html.TextBoxFor(m => m.GetAddress.Street), в этом случае вы заселение это значение свойства. Затем, когда вы POST вы тянете person.GetAddress.Street, который включает введенные данные.

0
  1. Причина, по которой GetAddress дает вам пустое текстовое поле, потому что он не установлен. Похоже, что вы могли бы хотеть, что будет на самом деле дает вам адрес Person «с, так что вы можете изменить его следующим образом:

    GetAddress 
    { 
        get { return address; } 
    } 
    

или в качестве альтернативы, просто изменить address поле к свойству:

public Address address { get; set; } 

Это дает вам возможность избавиться от GetAddress в целом, если вы пожелаете.

  1. Если вы задали GetAddress своим текстовым полем, это заставило бы его хранить значения, которые вы проходите.Поскольку в вашем образце кода GetAddress является автономным свойством, которое фактически не привязано к полю address класса Person, тогда при привязке к нему текстового поля значение изменится, а не фактическое address как вы ожидали. Вы могли бы обнаружить, что мое альтернативное решение для вопроса 1 решит эту проблему для вас.
0

Ваша недвижимость не связана автоматически с вашим полом. GetAddress { get; set; } автоматически генерирует поле, и свойство действует как синтаксический сахар для доступа к ним. Если вы просто хотите, чтобы обернуть address вы можете сделать следующее:

public Address GetAddress 
{ 
    get 
    { 
     return address; 
    } 
    set 
    { 
     address = value; 
    } 
} 

В качестве альтернативы, вы можете просто избавиться от своей области, и делать (что дает публичные методы получения и установки):

public Address Address { get; set; } 
+0

Возможно, вам захочется , чтобы изменить регистр на свойстве 'public Address Address {}' в нижней части сообщения, чтобы случай имени свойства отличался от типа. Что-то вроде: 'public Address address {get; задавать; } ' – c1phr

+0

Общее соглашение C# говорит, что свойства должны быть PascalCase. Разумеется, точное использование/присвоение имен будет зависеть от вашей рабочей среды/команды и т. Д. –

+0

Это правда, но я считаю, что присвоение имени свойствам точно так же, как тип замаскирует свойство и/или выбросит ошибку компилятора. – c1phr

Смежные вопросы