2016-03-19 4 views
0

チケットのページに移動して問題が発生したときにチケットを作成する発券システムを作成しています。 これはMVC4 with EF6 Webアプリケーションであり、MVCに関する知識が不足しているために解決できないエラーが発生しています。MVC FOREIGN KEY制約 "FK_dbo.Ticket_dbo.User_UserID"と競合するINSERTステートメント

私は人からの指示に従っててきた

私のコードの私の以前のバージョンでは、私は、ユーザーのためにリストダウン別のドロップがあったが、それは間違っていたことを助言されました。

新しいチケットを作成し、そのチケットを 現在のユーザーに割り当てる必要があります。現在のユーザーは別のユーザーのチケット を作成できません。その プロパティのドロップダウンリストは表示しないでください。データモデルを保存する直前にPOST メソッドでのみAuthor(またはUserID`)の値を割り当てます。

私は、下の2番目の画像からわかるように、ユーザーのためのドロップダウンリストを取り出しました。 (!ModelState.IsValidが)あなたが もSelectListのの カテゴリのを作成するためにConfigureViewModel()メソッドを変更する必要があることを除いて正しいかどう

 Ticket ticket = new Ticket 
     { 
      Author = model.UserID, 
      Issue = model.Issue, 
      IssuedTo = model.IssuedTo, 
      CategoryID = model.CategoryID 
     }; 

あなたの最初の:私は私のチケットを作成するとき、私はまたAuthor = model.UserID,を追加しました。次に、Ticketデータモデルを作成し、すべての をCategoryIDなどのプロパティに設定する必要があります。

したがって、SelectViewまたはConfigureViewModelメソッドのカテゴリである以下のコードを追加しました。

IEnumerable<Category> categories = db.Categories.OrderBy(u => u.CategoryName); 
    model.CategoryList = categories.Select(a => new SelectListItem 
    { 
     Value = a.CategoryID.ToString(), 
     Text = a.CategoryName.ToString() 
    }); 

あなたは()db.SaveChangesを呼び出したら、次に、リダイレクトする必要があります。 ポイントを返すビューがありません。あなたがそれを行うならば、あなたはSelectListを入力していないので、 はエラーを投げ始めます。

この部分では、「リダイレクト」についてはわかりませんでした。私は()の戻りビューを削除した場合、私はTicketController.Create(TicketVM)を言っpublic ActionResult Create(TicketVM model)上のエラーを取得し、すべてのコードパスは、[値]

FOREIGN KEY制約 「FK_dbo.Ticket_dbo.User_UserID」と競合INSERT文を返しません。競合がデータベース "RecreationalServicesTicketingSystem.DAL.IssueContext"テーブル "dbo.User"、列 'UserID'で発生しました。ステートメントは終了されました。

enter image description here enter image description here

TicketController.cs(POST METHOD SNIPPET)

namespace RecreationalServicesTicketingSystem.Controllers 
{ 
    public class TicketController : Controller 
    { 
     private IssueContext db = new IssueContext(); 

     // 
     // GET: /Ticket/Create 

     public ActionResult Create() 
     { 

      TicketVM model = new TicketVM(); 
      ConfigureViewModel(model); 
      ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName"); 
      ViewBag.AllUsers = db.Users.ToList().Select(u => new SelectListItem() { Value = u.UserID.ToString(), Text = string.Format("{0} {1}", u.FirstMidName, u.LastName) }); 
      return View(model); 
     } 

     // 
     // POST: /Ticket/Create 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(TicketVM model) 
     { 


      if (!ModelState.IsValid) 
      { 
       ConfigureViewModel(model); 
       return View(model); 
      } 

      Ticket ticket = new Ticket 
      { 
       Author = model.UserID, 
       Issue = model.Issue, 
       IssuedTo = model.IssuedTo, 
       CategoryID = model.CategoryID 
      }; 

       db.Tickets.Add(ticket); 
       db.SaveChanges(); 


      ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName", ticket.CategoryID); 
    //   ViewBag.AllUsers = db.Users.ToList().Select(u => new SelectListItem() { Value = u.UserID.ToString(), Text = string.Format("{0} {1}", u.FirstMidName, u.LastName) }); 
//   ViewBag.AllAdmins = db.Users.Where(u => u.IsAdministrator).Include(u => u.Tickets); 
      return View(ticket); 
     } 

     private void ConfigureViewModel(TicketVM model) 
     { 
      IEnumerable<User> admins = db.Users.Where(u => u.IsAdministrator).OrderBy(u => u.LastName); 
      model.AdministratorList = admins.Select(a => new SelectListItem 
      { 
       Value = a.UserID.ToString(), 
       Text = string.Format("{0} {1}", a.FirstMidName, a.LastName) 
      }); 
      IEnumerable<Category> categories = db.Categories.OrderBy(u => u.CategoryName); 
      model.CategoryList = categories.Select(a => new SelectListItem 
      { 
       Value = a.CategoryID.ToString(), 
       Text = a.CategoryName.ToString() 
      }); 
     } 

ビューが作成\チケットを\。CSHTML

@model RecreationalServicesTicketingSystem.ViewModels.TicketVM 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Ticket</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.CategoryID, "Category") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("CategoryID", String.Empty) 
      @Html.ValidationMessageFor(model => model.CategoryID) 
     </div> 

     <div class="editor-field"> 
      @using (Html.BeginForm()) 
      { 
       @Html.HiddenFor(m => m.UserID) 
       <div class="form-group"> 
        @Html.LabelFor(m => m.IssuedTo) 
        @Html.DropDownListFor(m => m.IssuedTo, Model.AdministratorList, "Please select", new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.IssuedTo) 
       </div> 
       <div class="form-group"> 
        @Html.LabelFor(m => m.Issue) 
        @Html.TextBoxFor(m => m.Issue, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.Issue) 
       </div> 
      } 
     </div> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
</fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

!!!!!!!!!!!!!!!コードの変更!!!!!!!!!!!!!!!!!!!!!!!! !

TicketController.cs

public class TicketController : Controller 
{ 
    private IssueContext db = new IssueContext(); 

    // 
    // GET: /Ticket/ 

    public ActionResult Index() 
    { 
     var tickets = db.Tickets.Include(t => t.Category).Include(t => t.User);  
     return View(tickets.ToList()); 
    } 

    // 
    // GET: /Ticket/Details/5 

    public ActionResult Details(int id = 0) 
    { 
     Ticket ticket = db.Tickets.Find(id); 
     if (ticket == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(ticket); 
    } 

    // 
    // GET: /Ticket/Create 

    public ActionResult Create() 
    { 
     TicketVM model = new TicketVM(); 
     ConfigureViewModel(model); 
     return View(model); 
    } 

    // 
    // POST: /Ticket/Create 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(TicketVM model) 
    { 


     if (!ModelState.IsValid) 
     { 
      ConfigureViewModel(model); 
      return View(model); 
     } 

     Ticket ticket = new Ticket 
     { 
      //UserID = (int)WebSecurity.CurrentUserId, 
      // Author = model.UserID, 
      Issue = model.Issue, 
      IssuedTo = model.IssuedTo, 
      CategoryID = model.CategoryID 
     }; 

      db.Tickets.Add(ticket); 
      db.SaveChanges(); 

     return RedirectToAction("Index"); 

    } 

    private void ConfigureViewModel(TicketVM model) 
    { 
     IEnumerable<User> admins = db.Users.Where(u => u.IsAdministrator).OrderBy(u => u.LastName); 
     model.AdministratorList = admins.Select(a => new SelectListItem 
     { 
      Value = a.UserID.ToString(), 
      Text = string.Format("{0} {1}", a.FirstMidName, a.LastName) 
     }); 
     IEnumerable<Category> categories = db.Categories.OrderBy(u => u.CategoryName); 
     model.CategoryList = categories.Select(a => new SelectListItem 
     { 
      Value = a.CategoryID.ToString(), 
      Text = a.CategoryName.ToString() 
     }); 
    } 

    // 
    // GET: /Ticket/Edit/5 

    public ActionResult Edit(int id = 0) 
    { 
     Ticket ticket = db.Tickets.Find(id); 
     if (ticket == null) 
     { 
      return HttpNotFound(); 
     } 
     ViewBag.AllAdmins = db.Users.Where(u => u.IsAdministrator).Include(u => u.Tickets); 
     return View(ticket); 
    } 

    // 
    // POST: /Ticket/Edit/5 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(Ticket ticket) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(ticket).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.AllAdmins = db.Users.Where(u => u.IsAdministrator).Include(u => u.Tickets); 
     return View(ticket); 
    } 

ビューはチケット\ Create.cshtml \

エラーが表にTicket_dboは、あなたが列User_UserIDが、そのユーザーにユーザーIDを挿入しようとしていると言っている
@model RecreationalServicesTicketingSystem.ViewModels.TicketVM 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Ticket</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.CategoryID, "Category") 
     </div> 


     <div class="editor-field"> 
      @using (Html.BeginForm()) 
      { 
       @Html.HiddenFor(m => m.UserID) 
       <div class="form-group"> 
        @Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "Please select", new { @class = "form-control" }) 
       </div> 
       <div class="form-group"> 
        @Html.LabelFor(m => m.IssuedTo) 
        @Html.DropDownListFor(m => m.IssuedTo, Model.AdministratorList, "Please select", new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.IssuedTo) 
       </div> 
       <div class="form-group"> 
        @Html.LabelFor(m => m.Issue) 
        @Html.TextBoxFor(m => m.Issue, new { @class = "form-control" }) 
        @Html.ValidationMessageFor(m => m.Issue) 
       </div> 
      } 
     </div> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
</fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+1

Q1:GETメソッドから 'ViewBag.AllUsers = ....'を削除してください。 –

+1

Q2: 'ConfigureViewModel()'メソッドの改訂コードは、 'ViewBag.CategoryID = new SelectList(...) 'をGETメソッドとPOSTメソッドから削除し、ビューコードを' @Html.DropDownListFor(m => m.CategoryId、Model.CategoryList、 "Please select"、new {@class = ".pdfを編集して、フォームタグの中に移動してください。 –

+1

Q3:RedirectToAction( "Index"); '(または、チケットの保存に成功しました –

答えて

0

IDはテーブルdbo.Userに存在しません。これは、外部キー制約がどのように機能するかです。したがって、まずデータベースにユーザーを挿入するか、存在しない場合はそのユーザーが存在するかどうかを確認し、必要に応じて状況を処理してください。

一度db.SaveChanges()を呼び出すと、リダイレクトする必要があります。戻り値View()を呼び出すポイントはありません。あなたがそうするならば、SelectListを実装していないのでエラーを投げ始めます。

はい彼/彼女は正しいです。単にビューを返すべきではありません。しかし、ブラウザが別のページを取得できるようにリダイレクトを送信してください。 Hereはどうやってそれをやるべきかです。

関連する問題