Asp.net mvc ASP MVC 3.0复杂视图

Asp.net mvc ASP MVC 3.0复杂视图,asp.net-mvc,razor,Asp.net Mvc,Razor,我正在使用ASP.NET MVC 3.0开发一个销售订单管理应用程序。我需要开发一个页面,其中可以添加客户详细信息 客户详细信息包括 public class Customer { public int ID { get; set; } public string Code { get; set; } public string Name { get; set; } public string Alias { get; se

我正在使用ASP.NET MVC 3.0开发一个销售订单管理应用程序。我需要开发一个页面,其中可以添加客户详细信息

客户详细信息包括

public class Customer
    {
        public int ID { get; set; }
        public string Code { get; set; }
        public string Name { get; set; }
        public string Alias { get; set; }
        public int DefaultCreditPeriod { get; set; }        
        public Accounts Accounts { get; set; }
        public IList<Address> Addresses { get; set; }
        public IList<Contact> Contacts { get; set; }
    }

public class Accounts
    {
        public int ID { get; set; }
        public string VATNo { get; set; }
        public string CSTNo { get; set; }
        public string PANNo { get; set; }
        public string TANNo { get; set; }
        public string ECCNo { get; set; }
        public string ExciseNo { get; set; }
        public string ServiceTaxNo { get; set; }
        public bool IsServiceTaxApplicable { get; set; }
        public bool IsTDSDeductable { get; set; }
        public bool IsTCSApplicable { get; set; }
    }

public class Address 
    {
        public int ID { get; set; }
        public AddressType Type { get; set; }        
        public string Line1 { get; set; }
        public string Line2 { get; set; }
        public string Line3 { get; set; }
        public string Line4 { get; set; }
        public string Country { get; set; }
        public string PostCode { get; set; }
    }

public class Contact
    {
        public int ID { get; set; }
        public ContactType Type { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }
        public string PhoneNumber { get; set; }
        public string Extension { get; set; }
        public string  MobileNumber { get; set; }
        public string EmailId { get; set; }
        public string FaxNumber { get; set; }
        public string Website { get; set; }
    }
公共类客户
{
公共int ID{get;set;}
公共字符串代码{get;set;}
公共字符串名称{get;set;}
公共字符串别名{get;set;}
public int DefaultCreditPeriod{get;set;}
公共帐户{get;set;}
公共IList地址{get;set;}
公共IList联系人{get;set;}
}
公共类帐户
{
公共int ID{get;set;}
公共字符串VATNo{get;set;}
公共字符串CSTNo{get;set;}
公共字符串PANNo{get;set;}
公共字符串TANNo{get;set;}
公共字符串ECCNo{get;set;}
公共字符串{get;set;}
公共字符串ServiceTaxNo{get;set;}
公共布尔值IsServiceTaxApplicable{get;set;}
公共布尔是可推断的{get;set;}
公共布尔ISTCS适用{get;set;}
}
公共课堂演讲
{
公共int ID{get;set;}
公共地址类型{get;set;}
公共字符串Line1{get;set;}
公共字符串第2行{get;set;}
公共字符串第3行{get;set;}
公共字符串第4行{get;set;}
公共字符串国家{get;set;}
公共字符串邮政编码{get;set;}
}
公共类联系人
{
公共int ID{get;set;}
公共联系人类型{get;set;}
公共字符串名称{get;set;}
公共字符串标题{get;set;}
公共字符串PhoneNumber{get;set;}
公共字符串扩展名{get;set;}
公共字符串MobileNumber{get;set;}
公共字符串EmailId{get;set;}
公共字符串传真号码{get;set;}
公共字符串网站{get;set;}
}

客户需要一个页面来填写所有客户详细信息(一般信息、帐户信息、地址信息和联系信息)。将有多个地址(账单、发货等)和多个联系人(销售、采购)。我是MVC新手。如何为上述内容创建视图并动态添加多个地址?

将根模型对象传递给控制器中的视图调用,如下所示:

public ActionResult Index() {
   var customer = GetCustomer(); // returns a Customer
   return View(customer);
}
@model Customer

<!DOCTYPE html>
<!-- etc., etc. -->
<h1>Customer @Model.Name</h1>
<ul>
@foreach (var address in Model.Addresses) {
   <li>@address.Line1</li>
}
</ul>
[HttpPost]
public ActionResult(Customer customer, Accounts accounts, List<Address> addressList)
{
   //Handle db stuff here
}
[HttpPost]
public PartialResult AddAddress(List<Address> addressList)
{
   addressList.Add(new Address);

   return PartialView(addressList);
}
然后您的视图如下所示:

public ActionResult Index() {
   var customer = GetCustomer(); // returns a Customer
   return View(customer);
}
@model Customer

<!DOCTYPE html>
<!-- etc., etc. -->
<h1>Customer @Model.Name</h1>
<ul>
@foreach (var address in Model.Addresses) {
   <li>@address.Line1</li>
}
</ul>
[HttpPost]
public ActionResult(Customer customer, Accounts accounts, List<Address> addressList)
{
   //Handle db stuff here
}
[HttpPost]
public PartialResult AddAddress(List<Address> addressList)
{
   addressList.Add(new Address);

   return PartialView(addressList);
}
@model客户
Customer@Model.Name
    @foreach(Model.Addresses中的变量地址){
  • @地址.第1行
  • }
一个人了解情况


上面的代码取决于@model指令,这在ASP.NET MVC 3中是新的(请参阅)。

是一个好问题:D对于正常的导航属性,例如
帐户
这样做并不难:

@Html.EditorFor(model => model.Accounts.ID)

@Html.EditorFor(model => model.Accounts.VATNo)

我会做你想做的事。但是对于集合导航属性(
地址
联系人
),默认情况下不能在一个位置执行此操作。我建议您对
地址
(和
联系人
)使用不同的页面。因为这是最简单的方法。但是,如果您想在一个地方执行此操作(并且不需要AJAX请求),您可以通过
客户创建视图,对模型及其简单的导航属性使用脚手架,对于列表(
地址
联系人
),您必须使用JavaScript将其添加到
输入
字段中(例如,对于添加的每个
地址
,将其放入
数组
)并将字段发布到服务器。在服务器上,您可以通过默认模型绑定器获取主模型和简单属性,对于列表,您可以1)创建自己的模型绑定器2)自己从输入的字符串解析它们。好锁

我经常创建包装器模型来处理这种情况,例如

public class CustomerWrapperModel
{
    public Customer Customer { get; set;}
    public Accounts Accounts { get; set;}
    public List<Address> AddressList { get; set}

    //Add
    public CustomerWrapperModel()
    {

    }

    //Add/Edit
    public CustomerWrapperModel(Customer customer, Accounts accounts, List<Address> addressList)
    {
        this.Customer = customer;
        this.Accounts = accounts;
        this.AddressList = addressList;
    }
}
并有一个控制器接收如下所示的帖子:

public ActionResult Index() {
   var customer = GetCustomer(); // returns a Customer
   return View(customer);
}
@model Customer

<!DOCTYPE html>
<!-- etc., etc. -->
<h1>Customer @Model.Name</h1>
<ul>
@foreach (var address in Model.Addresses) {
   <li>@address.Line1</li>
}
</ul>
[HttpPost]
public ActionResult(Customer customer, Accounts accounts, List<Address> addressList)
{
   //Handle db stuff here
}
[HttpPost]
public PartialResult AddAddress(List<Address> addressList)
{
   addressList.Add(new Address);

   return PartialView(addressList);
}
注意。我知道有些人有这样做的问题,因为它需要一个服务器端点击添加字段到一个页面,可以很容易地添加到客户端(我总是这样做所有客户端,但尝试了一次这种方法,从来没有回去)。我这样做的原因是,这是保持列表项上的索引正确的最简单方法,特别是当您有insert和add,并且您的对象有很多属性时。此外,通过使用局部视图呈现数据,您可以确保在新字段上为您生成现成的验证,而不必手动雕刻新添加的客户端字段的验证。在大多数情况下,在ajax请求期间传输的数据量很小


您也可以选择对发送到AddAddress控制器的字段进行更精细的处理,因为您可以看到我只是将整个表单发布到控制器,而忽略除地址字段以外的所有内容,我使用的是fast服务器和附加的(次要的)与我可能浪费的时间相比,不需要的表单字段的开销可以忽略不计,因为我可以以更节省带宽的方式对此类功能进行编码。

无意冒犯,但您希望得到什么样的答案?你所要求的将涉及许多不连续的步骤,所有这些都需要一些学习。你最好看一些例子(比如官方网站),试着自己创建页面,一旦你提出了更具体的问题,再来看看。谢谢Rob,这很有意义。让我试试。