【发布时间】:2013-01-11 17:18:20
【问题描述】:
我正在编写一个页面来向客户发送电子邮件。选择客户发送电子邮件的方法之一是选择他们拥有的产品。每个产品都有不同的详细信息,您还可以选择有关产品的详细信息以缩小您发送电子邮件的范围。
因为这会很复杂,我需要进行处理以在控制器端提供客户电子邮件列表,但尝试从控件中提取所有数据以手动发送给它将是一场噩梦。
我想使用 AJAX 调用,在控制器端将模型绑定到视图,查询数据库,然后发回电子邮件列表,以便在视图上我可以使用列表为他们弹出 Outlook已填充的电子邮件地址。因为我需要用数据返回视图,所以我认为我不能通过表单发布来做到这一点,这就是我通常将模型放入控制器的方式。
有人知道我如何做到这一点吗?
以下是我必须尝试帮助人们理解我的布局的一些类
public class ProductType
{
[HiddenInput(DisplayValue = false)]
public int ID { get; set; }
[Required(ErrorMessage = "Please enter a product type description")]
public string Description { get; set; }
public virtual ICollection<ProductTypeDetail> ProductDetails { get; set; }
}
public class ProductTypeDetail
{
[HiddenInput(DisplayValue = false)]
public int ID { get; set; }
[HiddenInput(DisplayValue = false)]
public int? ProductTypeID { get; set; }
public ProductType ProductType { get; set; }
[Required(ErrorMessage = "Please enter a description")]
public string Description { get; set; }
[Required(ErrorMessage = "Please enter a valid type")]
public string Type { get; set; }
public virtual ICollection<ProductTypeDetailValidValue> ValidValues { get; set; }
}
以上 2 个类别适用于人们可以输入任意数量的产品类型。产品详细信息是您可能需要了解的有关产品的详细信息。例如,您可以拥有车辆登记系统的产品类型,并在其中放置一个产品详细信息项目,用于与您需要知道他们是否使用的产品相关的特定进口流程。
public Customer()
{
SiteVisits = new List<SiteVisit>();
Payments = new List<Payment>();
Contacts = new List<CustomerEmail>();
}
[HiddenInput(DisplayValue = false)]
public int ID { get; set; }
[Display(Name = "Name")]
[Required(ErrorMessage = "Please enter a customer name")]
public string CustomerName { get; set; }
[Display(Name = "Line 1")]
public string Address1 { get; set; }
[Display(Name = "Line 2")]
public string Address2 { get; set; }
[Display(Name = "Line 3")]
public string Address3 { get; set; }
[Display(Name = "Line 4")]
public string Address4 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
[HiddenInput(DisplayValue = false)]
[Required(ErrorMessage = "Please enter a customer type")]
public int CustomerTypeID { get; set; }
[Display(Name = "Type")]
public virtual CustomerType CustomerType { get; set; }
[HiddenInput(DisplayValue = false)]
[Required(ErrorMessage = "Please enter a customer status")]
public int CustomerStatusID { get; set; }
[Display(Name = "Status")]
public virtual CustomerStatus CustomerStatus { get; set; }
[DataType(DataType.MultilineText)]
public string Comments { get; set; }
[Required(ErrorMessage = "Please enter an expiration year")]
public long ExpirationYear { get; set; }
[Required(ErrorMessage = "Please enter an expiration month")]
public long ExpirationMonth { get; set; }
[Required(ErrorMessage = "Please enter a control name")]
public string ControlName { get; set; }
public Boolean Networked { get; set; }
public long Population { get; set; }
[Display(Name = "First Fiscal Month")]
public long FirstMonth { get; set; }
[Display(Name = "FTP User Name")]
public string FTPUserName { get; set; }
[Display(Name = "FTP Password")]
public string FTPPassword { get; set; }
[Display(Name = "Customer ID")]
public string CustomerUpdateID { get; set; }
[DataType(DataType.Date)]
[Display(Name = "Customer Since")]
public DateTime? StartDate { get; set; }
public virtual ICollection<CustomerPhoneNumber> PhoneNumbers { get; set; }
public virtual ICollection<CustomerProduct> Products { get; set; }
public virtual ICollection<CustomerEmail> Contacts { get; set; }
public virtual ICollection<SiteVisit> SiteVisits { get; set; }
public virtual ICollection<Payment> Payments { get; set; }
}
public class CustomerProduct
{
[HiddenInput(DisplayValue = false)]
public int ID { get; set; }
[HiddenInput(DisplayValue = false)]
public int? ProductTypeID { get; set; }
public virtual ProductType ProductType { get; set; }
[HiddenInput(DisplayValue = false)]
public int CustomerID { get; set; }
public virtual Customer Customer { get; set; }
[HiddenInput(DisplayValue = false)]
public int? VersionID { get; set; }
public virtual ProductVersion Version { get; set; }
[HiddenInput(DisplayValue = false)]
public int? StatusID { get; set; }
public virtual ProductStatus Status { get; set; }
public virtual ICollection<CustomerProductDetail> ProductDetails { get; set; }
}
public class CustomerProductDetail
{
[HiddenInput(DisplayValue = false)]
public int ID { get; set; }
[HiddenInput(DisplayValue = false)]
public int CustomerProductID { get; set; }
public virtual CustomerProduct CustomerProduct { get; set; }
[HiddenInput(DisplayValue = false)]
public int ProductTypeDetailID { get; set; }
public virtual ProductTypeDetail ProductTypeDetail { get; set; }
//[Required(ErrorMessage = "Please enter a value")]
public string Value { get; set; }
}
所以上面我有客户类。可以为每个客户设置您设置的任意数量的产品类型,并且您可以为该特定客户的该产品类型的产品详细信息选择值。客户还包含联系人。那是具有电子邮件地址的类。
所以我需要显示一个屏幕,显示您设置的所有产品类型,并让您为所选产品的详细项目选择值,然后我需要查询并找到与此匹配的客户
【问题讨论】:
-
我想如果情况变得更糟,我总是可以在表单发布时提供电子邮件地址,然后将这些数据用于不同的视图,我会在其中弹出 Outlook,但用户并没有真正需要另一个观点的观点,所以如果可能的话,我宁愿只从 1 个观点出发
-
我不明白这个问题。为什么从控件(视图)中提取所有数据以手动发送会是一场噩梦?它会使操作方法的签名过于复杂,还是因为实际上迭代和获取所有表单数据将是一场噩梦?如果后者见stackoverflow.com/questions/1960240/jquery-ajax-submit-form 见api.jquery.com/category/forms 即
serialize方法,则可用于将值序列化为ajax 提交。 -
这有点酷,但对我的情况没有帮助。我已经设置了我的程序,因此产品和产品详细信息是一个动态的东西,你可以添加它并且网站会处理它。如果我做一个序列化来做电子邮件,我基本上将不得不编写代码来处理所有的产品和细节,这样就违背了他们能够动态改变它们的目的。这就是我想要获取模型的原因,因为我有我的产品数组和它们动态设置的详细信息,我不需要知道任何关于它们的信息来查询数据库
-
我想我不明白你的处境,抱歉。
-
我在我使用的类中添加了一些描述,以帮助人们理解我要处理的内容。
标签: asp.net-mvc asp.net-mvc-3 model-view-controller