我将Customer和所有MembershipTypes从Customer Controller发送到Edit视图,因为我需要两者,如果你能告诉我如何在view中而不是在ViewBag.Message中发送两者的话以及为什么每次我编辑项目时我的应用程序都会出错请
我的客户类与membershipType类具有多对一关系:
public class Customer
{
public Customer()
{
this.Movies = new HashSet<Movie>();
}
public int id { get; set; }
[Required]
[StringLength(255)]
public String Name { get; set; }
public bool IsSubscribedToNewsletter { get; set; }
public int CurrentMembershipTypeId { get; set; }
public MembershipType CurrentMembershipType { get; set;}
public ICollection<Movie> Movies { get; set; }
}
我的会员类型类别:
public class MembershipType
{
public int Id { get; set; }
public short SignupFee { get; set; }
public byte DurationInMonths { get; set; }
public byte DiscountRate { get; set; }
public ICollection<Customer> Customers { get; set; }
// public virtual ICollection<Movie> Movie { get; set; }
}
我的客户控制器:获取客户功能编辑:
public ActionResult Edit(int id)
{
Customer customer = new Customer();
customer = iCustomerRepository.GetCustomerByID(id);
var membershipTypes = iMembershipTypeRepository.GetMembershipTypes();
ViewBag.Message = membershipTypes;
return View(customer);
}
客户编辑后操作:
[HttpPost]
public ActionResult Edit(Customer customer)
{
Customer Customer = new Customer();
Customer.id = customer.id;
Customer.Name = customer.Name;
Customer.IsSubscribedToNewsletter = customer.IsSubscribedToNewsletter;
Customer.CurrentMembershipTypeId = customer.CurrentMembershipTypeId;
iCustomerRepository.UpdateCustomer(Customer);
iCustomerRepository.Save();
return RedirectToAction("Customer");
}
客户表单编辑视图:
<form action="/Customer/Edit" method="post">
<table>
<tr>
<td>Id:</td>
<td><label for="CustomerId">ID:</label></td>
<td><input id="CustomerId" type="number" name="CustomerId" value="@Model.id" /></td>
</tr>
<tr>
<td>Name:</td>
<td><input id="CustomerName" type="text" name="CustomerName" value="@Model.Name" /></td>
</tr>
<tr>
<td>IsSubscribedToNewLetter:</td>
<td><input id="CustomerisSubscribedToNewsLetter" type="text" name="CustomerisSubscribedToNewsLetter" value="@Model.IsSubscribedToNewsletter" /></td>
</tr>
<tr>
<td>MembershipType:</td>
<td>
<select id="MembershipTypeId" name="MembershipTypeId">
@foreach (var membershipType in @ViewBag.Message)
{
<option value=@membershipType.Id>
@membershipType.Id
</option>
}
</select>
</td>
</tr>
</table>
<input type="submit" value="save" />
</form>
客户存储库类别:
命名空间WebApplication2.存储库.客户存储库
{
public class CustomerRepository : ICustomerRepository, IDisposable
{
private CustomerContext context;
public CustomerRepository(CustomerContext context)
{
this.context = context;
}
//public short GetMembershipTypeSignupFee()
//{
// var Customers = context.Customers.ToList();
// foreach (var customer in Customers)
// {
// return customer.CurrentMembershipType.SignupFee;
// }
//}
public IEnumerable<Customer> GetCustomers()
{
return context.Customers.ToList();
}
public Customer GetCustomerByID(int Id)
{
return context.Customers.Find(Id);
}
public void InsertCustomer(Customer customer)
{
context.Customers.Add(customer);
}
//public void InsertMany()
//{
// context.Customers.AddRange(context.Customers);
//}
public void DeleteCustomer(int Id)
{
Customer customer = context.Customers.Find(Id);
context.Customers.Remove(customer);
}
public void DeleteAllCustomers()
{
context.Customers.RemoveRange(context.Customers);
context.SaveChanges();
}
public void UpdateCustomer(Customer customer)
{
context.Entry(customer).State = EntityState.Modified;
}
public void Save()
{
context.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
由于您还没有显示存储库方法,这只是猜测
iCustomerRepository.UpdateCustomer(Customer);
试图添加一个新客户,但数据库正确地拒绝了它,因为具有给定id的记录已经存在。
存储库方法需要加载现有客户,然后更改其属性。BTW。通常情况下,SaveChanges
在存储库中调用,而不是由控制器调用。
类似以下内容。
var Upadate(Customer customer) {
// Authorization code here maybe
using( var context = ... ) {
var dbCustomer = c.Customers.FirstOrDefault( c => c.Id = customer.id );
if( dbCustomer == null ) throw new KeyNotFoundException("Customer not found!");
dbCustomer.A = ...;
dbCustomer.B = ...;
context.SaveChanges();
}
我鼓励您使用以小写字母开头的名称作为变量