안녕하세요, 저는 최근에 asp.net에 들어가기 시작했습니다. 아직 익숙하지 않습니다. 나는 프로젝트에서 일하고 벽에 부딪쳤다. 먼저 프로젝트에 대해 자세히 설명해 드리겠습니다. 나는 그들과 함께 작업을 공유 할 수있는 "연락처"로 등록 된 다른 기존 사용자를 추가 할 수있는 몇 가지 기능 중 하나를 사용하여 스케줄링 시스템을 만들려고합니다.asp.net MVC에서 두 개의 기본 키가있는 데이터베이스에서 항목을 삭제하려면 어떻게합니까?
사용자는 기존 사용자의 이메일을 검색하여이를 수행하며, 존재하는 경우 해당 사용자를 연락처로 추가 할 수 있습니다.
여기 내 문제가 있습니다. 연락처 및 모든 추가 잘 작동하지만 그들을 삭제하는 데 문제가 있습니다. 삭제 작업 링크에 대한 인덱스보기에서는 ContactUserId와 ApplicationUserId를 모두 사용하여 연결 클래스이고 두 개의 기본 키가 있기 때문에 작동하지 않습니다. 나를 도울 꺼려하는 내 친구는 두 개의 기본 키를 묶어야한다고 제안했지만 어떻게 해야할지 잘 모릅니다. 어떤 도움을 주셔서 감사합니다.
컨트롤러 :
[Authorize]
public class ContactsController : Controller
{
private ApplicationDbContext db = new ApplicationDbContext();
// GET: Contacts
public ActionResult Index()
{
IEnumerable<ApplicationUser> users = db.Users.ToList();
IEnumerable<Contact> contacts = db.Contacts.ToList().Where(c => c.ApplicationUserID.Equals(User.Identity.Name));
List<ApplicationUser> curUsers = new List<ApplicationUser>();
foreach (var contact in contacts)
{
foreach (var user in users)
{
if (contact.ContactUserID.Equals(user.UserName))
{
curUsers.Add(user);
}
}
}
ContactsViewModel cvm = new ContactsViewModel();
cvm.users = curUsers;
cvm.contacts = contacts;
return View(cvm);
}
// GET: Contacts/Details/5
public ActionResult Details(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Contact contact = db.Contacts.Find(id);
if (contact == null)
{
return HttpNotFound();
}
return View(contact);
}
// GET: Contacts/Create
public ActionResult Create()
{
return View();
}
// POST: Contacts/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ApplicationUserID,ContactUserID,Date")] Contact contact)
{
if (!String.IsNullOrWhiteSpace(contact.ContactUserID))
{
var count = db.Users.Count(u => u.UserName == contact.ContactUserID);
if (count != 0)
{
contact.ApplicationUserID = User.Identity.Name;
contact.Date = DateTime.Today;
db.Contacts.Add(contact);
db.SaveChanges();
return RedirectToAction("Index");
}
//User already exist error message
}
return View(contact);
}
// GET: Contacts/Edit/5
public ActionResult Edit(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Contact contact = db.Contacts.Find(id);
if (contact == null)
{
return HttpNotFound();
}
return View(contact);
}
// POST: Contacts/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ApplicationUserID,ContactUserID,Date")] Contact contact)
{
if (ModelState.IsValid)
{
db.Entry(contact).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(contact);
}
// GET: Contacts/Delete/5
public ActionResult Delete(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Contact contact = db.Contacts.Find(id);
if (contact == null)
{
return HttpNotFound();
}
return View(contact);
}
// POST: Contacts/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(string id)
{
Contact contact = db.Contacts.Find(id);
db.Contacts.Remove(contact);
db.SaveChanges();
return RedirectToAction("Index");
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
모델 :
public class Contact
{
[Key]
[Column(Order = 0)]
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string ApplicationUserID { get; set; }
[Key]
[Column(Order = 1)]
[Display(Name = "Contact Email")]
[Required (ErrorMessage = "Contact email is required")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string ContactUserID { get; set; }
public DateTime Date { get; set; }
}
색인보기 :
@model MySchedule.ViewModels.ContactsViewModel
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Add", "Create")
</p>
<table class="table">
<tr>
<th>
<[email protected]@Html.DisplayNameFor(model => model.Date)-->
First Name
</th>
<th>
Last Name
</th>
<th>
Email Name
</th>
<th></th>
</tr>
@{
var users = Model.users;
@foreach (var item in users)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
<td>
@Html.ActionLink("D", "Details", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("X", "Delete", new { /* id=item.PrimaryKey */ })
</td>
</tr>
}
}
</table>
뷰 모델 :
public class ContactsViewModel
{
public IEnumerable<ApplicationUser> users { get; set; }
public IEnumerable<Contact> contacts { get; set; }
}
고맙습니다. 지금은 이해합니다. 그러나 문제는 Model.users를 반복하여 전자 메일, 연락처 및 성을 표시해야한다는 것입니다. – Eli2099
@DeanStrydom, 문제 없습니다. 기꺼이 도와주세요. Contact 클래스에 이러한 속성이 있다고 생각하지 않습니다. 아마도 귀하의 연락처 클래스에 필요한 속성을 추가하고 해당 속성을보기에 표시해야합니다. 또한 여러 열의 삭제 문제에 대해 물어볼 때 문제가 해결되었다고 생각되면 답변을 표시해 주시겠습니까? –