Asp.net mvc ASP MVC 3.0复杂视图
我正在使用ASP.NET 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
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,这很有意义。让我试试。