ASP.NET MVC 3 перевод нескольких моделей в одну форму

#asp.net-mvc #asp.net-mvc-3 #forms #multiple-tables

#asp.net-mvc #asp.net-mvc-3 #формы #несколько таблиц

Вопрос:

Я учусь ASP.NET MVC 3 и попытка создать представление с единой формой, которая состоит из нескольких моделей, связанных вместе внешним ключом. Конечная цель — вставить единую форму во все таблицы базы данных.

Проблема в том, что я не могу понять, почему, когда я щелкаю правой кнопкой мыши, чтобы создать представление, форма не генерируется автоматически в файле cshtml. Автоматически сгенерированный код очень помогает, поскольку у меня есть много таблиц, которые связываются вместе, и много полей, которые я должен проверить и вставить. Если невозможно автоматически сгенерировать форму, какой наиболее эффективный / элегантный способ сделать это?

Вот упрощение того, что у меня есть.

Модель:

 class Customer
{
    [Key]
    public UInt64 CustomerId { get; set; }

    [Required(ErrorMessage = "Name is required.")]
    [Display(Name = "Customer Name")]
    [MaxLength(50)]
    public string FullName { get; set; }
}

class CustomerAdditionalDetails1
{
    [ForeignKey("Customer")]
    public UInt64 CustomerId { get; set; }

    [Required(ErrorMessage = "This info is required.")]
    [Display(Name = "Customer Information")]
    [MaxLength(50)]
    public string SomeInfo { get; set; }
}

class CustomerAdditionalDetails2
{  // same foreign key as CustomerAddtionalDetails1, but with different properties
}

class CustomerAdditionalDetails3
{  // same foreign key as CustomerAddtionalDetails1, but with different properties
}

...

public class CustomerModel
{
    public Customer Customer { get; set; }
    public CustomerAdditionalDetails1 CustomerAdditionalDetails1 { get; set; }
    public CustomerAdditionalDetails2 CustomerAdditionalDetails2 { get; set; }
    public CustomerAdditionalDetails3 CustomerAdditionalDetails3 { get; set; }
    ...
}
  

Контроллер:

 public ActionResult Submit()
{
    return View();
}

[HttpPost]
public ActionResult Submit(CustomerModel customer)
{
    return View();
}
  

Пожалуйста, помогите!

Ответ №1:

При создании представления вы создаете строго типизированное представление на основе CustomerModel? Если вы затем создаете представление, оно не будет выводить никаких значений на странице, потому что все ваши свойства являются ссылками на другие объекты. Вам нужны фактические типы значений, содержащиеся в модели, чтобы строительные леса автоматически включали их в представление. Тем не менее, вы всегда можете добавить их в представление самостоятельно, как показано в примере ниже.

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

 @model MvcApplication3.Models.CustomerModel

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<fieldset>
    <legend>CustomerModel</legend>
</fieldset>
<ul>
<li>@Model.Customer.FullName</li>
<li>@Model.CustomerAdditionalDetails1.SomeInfo1</li>
<li>@Model.CustomerAdditionalDetails2.SomeInfo2</li>
</ul>
<p>
    @Html.ActionLink("Edit", "Edit", new { /* id=Model.PrimaryKey */ }) |
    @Html.ActionLink("Back to List", "Index")
</p>


public class CustomerController : Controller
    {
        public ActionResult Index()
        {
            CustomerModel customerModel = new CustomerModel() 
            { 
                Customer = new Customer()
                {
                    FullName = "Dan"
                },
                CustomerAdditionalDetails1 = new CustomerAdditionalDetails1() 
                { 
                    SomeInfo1 = "Somewhere1" 
                },
                CustomerAdditionalDetails2 = new CustomerAdditionalDetails2()
                {
                    SomeInfo2 = "Somewhere2"
                },
                CustomerAdditionalDetails3 = new CustomerAdditionalDetails3()
                {
                    SomeInfo3 = "Somewhere3"
                }
            };

            return View(customerModel);
        }
    }