MVC, как повторно использовать представление с моделью родительского класса - PullRequest
0 голосов
/ 29 марта 2019

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

public class Address
{
    public string CountryName { get; set; }
    public string CityName { get; set; }
    public string StreetName { get; set; }
    public string PostalCode { get; set; }
    public string StreetNumber { get; set; }
}

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
}

Вид должен выглядеть следующим образом: нет формы * тега 1005 *, нет кнопки отправки, только элементы управления, привязанные к модели

@Html.LabelFor(m => m.CountryName)
@Html.TextBoxFor(m => m.CountryName)

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

Проблема возникает, когда я пытаюсь использовать ее в другой форме, где Адрес является свойством модели, а не самой модели (Заказчик). Я не могу просто указать поле Address в качестве модели для этого представления, потому что действие ожидает Customer.Address, но элементы управления привязаны к свойствам без упоминания Customer

Вот в чем разница в HTML

<!-- Edit Address -->
<label for="CountryName_input">Country</label>
<input id="CountryName_input" name="CountryName" type="text" value="">

<!-- Edit Customer -->
<label for="Address_CountryName_input">Country</label>
<input id="Address_CountryName_input" name="Address.CountryName" type="text" value="">

Есть ли способ использовать это представление в обоих случаях? Я начал исследовать помощника HTML, который занял бы

Expression<Func<TModel, string>> selector

, но безуспешно до сих пор.

Кто-нибудь может мне помочь?

...