【问题标题】:Pass model to controller and send result to page not using form submit将模型传递给控制器​​并将结果发送到不使用表单提交的页面
【发布时间】: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-formapi.jquery.com/category/formsserialize 方法,则可用于将值序列化为ajax 提交。
  • 这有点酷,但对我的情况没有帮助。我已经设置了我的程序,因此产品和产品详细信息是一个动态的东西,你可以添加它并且网站会处理它。如果我做一个序列化来做电子邮件,我基本上将不得不编写代码来处理所有的产品和细节,这样就违背了他们能够动态改变它们的目的。这就是我想要获取模型的原因,因为我有我的产品数组和它们动态设置的详细信息,我不需要知道任何关于它们的信息来查询数据库
  • 我想我不明白你的处境,抱歉。
  • 我在我使用的类中添加了一些描述,以帮助人们理解我要处理的内容。

标签: asp.net-mvc asp.net-mvc-3 model-view-controller


【解决方案1】:

我需要做的就是序列化表单并将其作为数据传递给我的 ajax 调用。如果在被调用的控制器端,我有一个与模型类型相同的参数,我的视图是强类型的模型绑定器足够聪明,可以自动填充我的对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2014-05-29
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多