2011-05-22 31 views
8

我正在学习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(); 
} 

请帮帮忙!

回答

7

当您生成视图时,您是否基于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); 
     } 
    }