ASP.NET MVC 3 нескольких моделей в одну форму - PullRequest
8 голосов
/ 22 мая 2011

Я изучаю 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 Ответ

7 голосов
/ 22 мая 2011

Когда вы генерируете представление, вы создаете строго типизированное представление на основе 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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...