Средства доступа по сравнению с общедоступными участниками

Для простоты вы можете отправлять информацию с клиента на сервер с привязкой Razor Model.

Для Bazor Model Binding вам необходимо использовать [BindProperty].

Вот рабочая демонстрация:

IndexModel

public class IndexModel : PageModel
{
    public void OnGet()
    {

    }
    [BindProperty]
    public EmailConfig emailConfig { get; set; }
    public ActionResult OnPostSendEmail()
    {
        var email = emailConfig;
        return null;
    }
    public class EmailConfig
    {
        public string FromAddr { get; set; }
        //public string ToAddr { get; set; }
        public string Body { get; set; }
        public string Subject { get; set; }
        public string Phone { get; set; }
        public string Name { get; set; }
        public string LastName { get; set; }
    }
}

Для страницы бритвы клиента не нужно указывать id="Name" type="text" name="name", и вы не должны добавлять [ 115] при использовании asp-page-handler="sendemail"

<form asp-page-handler="sendemail" id="contact-form" method="post">
    <div class="messages"></div>
    <div class="controls">
        <div class="row">
            <div class="col-md-6">
                <input asp-for="emailConfig.Name" placeholder="Your firstname *" required="required" class="form-control">
            </div>
            <div class="col-md-6">
                <input asp-for="emailConfig.LastName" placeholder="Your lastname *" required="required" class="form-control">
            </div>
            <div class="col-md-6">
                <input asp-for="emailConfig.FromAddr" placeholder="Your email *" required="required" class="form-control">
            </div>
            <div class="col-md-6">
                <input asp-for="emailConfig.Phone" placeholder="Your phone" class="form-control">
            </div>
            <div class="col-md-12">
                <textarea asp-for="emailConfig.Body" placeholder="Message for me *" rows="4" required="required" class="form-control"></textarea>
            </div>
            <div class="col-md-12 text-center">
                <button type="submit" asp-route-data="HttpPostAttribute" asp-page-handler="SendEmail" class="btn btn-outline-primary">Send message</button>
            </div>
        </div>
    </div>
</form>
5
задан John Feminella 22 March 2009 в 12:57
поделиться

5 ответов

Если существуют инварианты, необходимо сохранить, то да. Иначе не беспокоиться.

13
ответ дан 18 December 2019 в 05:25
поделиться

Целая причина иметь средства доступа (методы считывания) и модификаторы (методы set) состоит в том, чтобы предоставить себе дополнительный уровень абстракции.

Этот дополнительный уровень абстракции позволяет Вам обеспечивать представление только для чтения своей переменной к открытому интерфейсу, не позволяя Вашему элементу данных быть измененным. Вы могли все еще использовать частный или защищенный метод set.

Методы set позволяют Вам делать специальную проверку ошибок, проверку и исправления, когда значение установлено. Например, setDirectory (станд. константы:: представьте &strPath в виде строки), Вы могли удостовериться, что существует завершающаяся наклонная черта, если пользователь не указывал тот. Это гарантирует, что Ваше состояние класса всегда будет допустимо.

Методы считывания могут также экранировать Ваших участников от представления их, чтобы позволить указатели им. Не позволяя указатели им с внешней стороны, можно удостовериться, что, если объект выходит из объема, это не приведет к катастрофическому отказу.

Дополнительный уровень абстракции для методов считывания/методов set также позволяет Вам мочь изменить элемент данных, который они инкапсулируют.

С методом считывания можно также получить другие взгляды на данные, пример: getMinutes, когда Ваш элемент данных на самом деле хранится в секундах.

Это не причина использовать их, но хороший побочный эффект использования методов считывания и методов set состоит в том, что можно установить точку останова в модификаторе, например, для наблюдения точно, когда это изменяется.

Должны ли Вы использовать их или не являетесь личным выбором на основе Вашей потребности. Если у Вас есть столько участников, что это - огромная боль для обеспечения методов считывания и настроек, Вы могли рассмотреть хранение элементов данных в структуре и использовании той структуры в Вашем классе вместо этого. Вы могли даже обеспечить методы считывания/методы set для объекта для целой структуры сразу.

19
ответ дан 18 December 2019 в 05:25
поделиться

Во-первых, если Ваш класс имеет много данных mamebers, он, вероятно, не хорошо разработан. Вы, возможно, должны рассмотреть разделение его в несколько классов или хранить данные в структурах, таких как карты.

Что касается обеспечения средств доступа вопросом является желание, Вы когда-либо хотите изменить доступ, возможно предотвращая его. Если ответ да, то Вам нужны функции доступа. С другой стороны, если Ваш класс является действительно просто мешком битов без поведения, то сделайте это структурой.

4
ответ дан 18 December 2019 в 05:25
поделиться

Используя добираются/методы установки для частных/защищенных элементов данных, плохой дизайн.

Это заставляет клиентский код зависеть от деталей реализации Вашего класса.

Изменения в Вашем классе вызывают изменения в клиентском коде.

Однако доберитесь/методы установки для общедоступных участников, может использоваться. Но всегда хорошо избежать их.

0
ответ дан 18 December 2019 в 05:25
поделиться

Необходимо использовать общедоступные элементы данных только

  • в структурах, которые Вы не выставляете клиентскому коду (например, функторы связывать-стиля) - бесполезно защитить структуры, которые никто снаружи никогда не будет получать
  • если их типы инкапсулируют логику набора/получения их (например, если Вы создаете класс ObservableAttribute),
  • если они - участники константы в неизменной структуре (Вы не можете сделать многого кроме считать их, если они неизменны),

При создании общедоступного элемента данных необходимо быть уверены, что его значение является полностью ортогональным с другими членами класса. Например, Вы отключаете будущие возможности

  • наблюдение изменений в участнике
  • то, чтобы заставлять участника играть любую роль в инварианте класса
  • отключение доступа к участнику
  • изменение реализации участника (например, вычисленный по сравнению с кэшируемым по сравнению с сохраненным), если для производительности нужен он
1
ответ дан 18 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: