我正在尝试将新项目添加到我的MVC应用程序中的现有列表中,我的问题是我不知道正确的方法。
到目前为止我已经这样做了:
我的客户代码:
控制器
public class CustomerController : Controller
{
public CustomerBusiness customerBusiness { get; set; }
public CustomerController()
{
customerBusiness = new CustomerBusiness();
}
//Some code that makes CRUD and more these methods
[HttpGet]
public ActionResult ViewAllJobOfferts(int id)
{
var cust = customerBusiness.GetById(id);
return View(cust.JobOfferts);
}
public ActionResult CreateJobOffert(int id)
{
var cust = customerBusiness.GetById(id);
return View(cust);
}
/* [HttpPost]
public ActionResult CreateJobOffert(JobOffertModel jobOffert)
{
return View();
}*/
}
我的实体Customer和JobOffert之间有 1到n 的关系,ViewAllJobOfferts方法运行正常,但是当我尝试添加新的JobOffert时,我遇到了困难。 我有几个问题,我们走了:
我必须创建一个特殊于JobOfferts或控件的控制器 在CustomerController中?
当我尝试创建将表单提交给新的视图时 JobOffert我不知道如何将客户链接到这个新客户 JobOffert,我尝试使用客户模型创建页面,我没有JobOffert属性,如果我使用JobOffert模型创建,我不知道如何使这两个对象之间的链接。我该怎么做?
PS:这里是两个模型的代码:
答案 0 :(得分:0)
我必须创建一个特殊于JobOfferts的控制器,或者控制内部 CustomerController?
不一定,像其他类一样的控制器应该遵循SRP(单一责任原则)。在这种情况下,只要CustomerController提供与客户相关的信息,它就完全没问题了。
当我尝试创建将表单提交给新JobOffert的视图时,我不知道如何将客户链接到这个新的JobOffert,如果我尝试使用客户模型创建页面,我没有JobOffert属性,如果我使用JobOffert模型创建,我不知道如何使这两个对象之间的链接。我该怎么做?
客户与JobOffer之间的链接与您定义的一对多之间的链接相同,实体包含对彼此的引用。例如。您可以通过查询JobDffer表(其中customerID = 1024)找到Id为1024的客户的所有JobOffer。同样,每个JobOffer都可以通过实体类中的Customer引用进行跟踪。
现在关于为客户创建新的JobOffer,您可以采用以下方式:
public class CustomerController : Controller
{
public CustomerBusiness customerBusiness { get; set; }
public CustomerController()
{
customerBusiness = new CustomerBusiness();
}
//Some code that makes CRUD and more these methods
[HttpGet]
public ActionResult ViewAllJobOffersForCustomer(int customerId)
{
ICollection<JobOfferModel> model = customerBusiness.GetAllJobOffersByCustomerId(customerId);
return View(model);
}
[HttpGet]
public ActionResult CreateJobOffer()
{
// Blank model object to accept values from user,
// you may like to create a view model based on UI needs.
JobOfferModel jobOfferModel = new JobOfferModel();
return View(jobOfferModel);
}
[HttpPost]
public ActionResult CreateJobOffer(JobOfferModel jobOffer)
{
// You get a filled object here that contains customer id and job offer details
customerBusiness.CreateJobOffer(jobOffer);
return RedirectToAction("ViewAllJobOffersForCustomer", new { customerId = jobOffer.CustomerId });
}
示例业务服务类:
public class CustomerBusiness
{
public ICollection<JobOfferModel> GetAllJobOffersByCustomerId(int customerId)
{
// TODO: Fetch job offer details from persistent store
// E.g.
// dataContext.JobOffers.Where(x => x.CustomerId == customerId).ToList();
throw new NotImplementedException();
}
public void CreateJobOffer(JobOfferModel jobOffer)
{
// TODO: Add job offer details in persistent store
// E.g.
// dataContext.JobOffers.Add(jobOffer);
}
}
修改过的实体类:
public class JobOfferModel
{
[Key]
public int Id { get; set; }
public string Description { get; set; }
[Required]
[DefaultValue(false)]
public bool Acepted { get; set; }
[Required]
[DefaultValue(true)]
public bool Active { get; set; }
[Required]
[Column(TypeName = "DateTime2")]
public DateTime JobDate { get; set; }
[ForeignKey("Id")]
public int CustomerId { get; set; }
public virtual CustomerModel Customer { get; set; }
}
public class CustomerModel
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Column(TypeName = "DateTime2")]
public DateTime BirthDate { get; set; }
public int PhoneNumber { get; set; }
public ICollection<JobOfferModel> JobOffert { get; set; }
}
所以基本上你会在CustomerController中有一个返回空ViewModel或Model对象的方法。在视图中,您将隐藏customerId。因此,当表单发布时,它会与JobOffer详细信息一起映射到正确的客户。在HttpPost方法中拥有模型对象后,您只需在JobOffer表(任何持久性存储)中插入一个条目,其中customerId与之关联。
还有其他细节,但上面的典型方法会给你一个良好的开端我希望。干杯