2014-04-24 1 views
0

사용자가 필요에 따라 데이터를 추가, 변경 또는 삭제할 수있는 단일보기에 여러 테이블의 데이터를 표시하려고합니다. 지금까지 컨트롤러 하나로 작업 할 수있는 단일보기를 얻지 못했습니다. 하나의보기가있는 여러 컨트롤러가 훨씬 적습니다. MVC 5, VS 2013 (C#)을 사용하고 데이터베이스가 다른 컴퓨터에서 호스팅됩니다.하나 이상의 컨트롤러를 MVC 5의 뷰에 어떻게 연결합니까?

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Net; 
using System.Web; 
using System.Web.Mvc; 
using Vivace.Models; 

namespace Vivace.Controllers 
{ 
    public class ItemController : Controller 
    { 
     private VivaceContext db = new VivaceContext(); 

     // GET: /Item/ 
     public ActionResult Index() 
     { 
      var items = db.Items.Include(i => i.Category1).Include(i => i.Department1).Include(i => i.Distributor1); 
      return View(items.ToList()); 
     } 

     // GET: /Item/Details/5 
     public ActionResult Details(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Item item = db.Items.Find(id); 
      if (item == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(item); 
     } 

     // GET: /Item/Create 
     public ActionResult Create() 
     { 
      ViewBag.Category = new SelectList(db.Categories, "CatNumber", "CatName"); 
      ViewBag.Department = new SelectList(db.Departments, "DeptNum", "DeptName"); 
      ViewBag.Distributor = new SelectList(db.Distributors, "DistributorNumber", "DistributorName"); 
      return View(); 
     } 

     // POST: /Item/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="ItemNumber,UPC,ItemName,Category,Department,Price,Cost,MarkUp,OnHand,InWherehouse,OnOrder,OnFeature,ShelfCap,Distributor")] Item item) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Items.Add(item); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      ViewBag.Category = new SelectList(db.Categories, "CatNumber", "CatName", item.Category); 
      ViewBag.Department = new SelectList(db.Departments, "DeptNum", "DeptName", item.Department); 
      ViewBag.Distributor = new SelectList(db.Distributors, "DistributorNumber", "DistributorName", item.Distributor); 
      return View(item); 
     } 

     // GET: /Item/Edit/5 
     public ActionResult Edit(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Item item = db.Items.Find(id); 
      if (item == null) 
      { 
       return HttpNotFound(); 
      } 
      ViewBag.Category = new SelectList(db.Categories, "CatNumber", "CatName", item.Category); 
      ViewBag.Department = new SelectList(db.Departments, "DeptNum", "DeptName", item.Department); 
      ViewBag.Distributor = new SelectList(db.Distributors, "DistributorNumber", "DistributorName", item.Distributor); 
      return View(item); 
     } 

     // POST: /Item/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="ItemNumber,UPC,ItemName,Category,Department,Price,Cost,MarkUp,OnHand,InWherehouse,OnOrder,OnFeature,ShelfCap,Distributor")] Item item) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Entry(item).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      ViewBag.Category = new SelectList(db.Categories, "CatNumber", "CatName", item.Category); 
      ViewBag.Department = new SelectList(db.Departments, "DeptNum", "DeptName", item.Department); 
      ViewBag.Distributor = new SelectList(db.Distributors, "DistributorNumber", "DistributorName", item.Distributor); 
      return View(item); 
     } 

     // GET: /Item/Delete/5 
     public ActionResult Delete(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Item item = db.Items.Find(id); 
      if (item == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(item); 
     } 

     // POST: /Item/Delete/5 
     [HttpPost, ActionName("Delete")] 
     [ValidateAntiForgeryToken] 
     public ActionResult DeleteConfirmed(int id) 
     { 
      Item item = db.Items.Find(id); 
      db.Items.Remove(item); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       db.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 
    } 
} 

이가있다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Vivace.Models; 

namespace Vivace.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public VivaceContext db = new VivaceContext(); 
     List<Distributor> list = new List<Distributor>(); 
     public ActionResult Index() 
     { 
     // var ist = db.Distributors.FirstOrDefault(x => x.Address == "").Orders.ToList(); 
     // var i = db.Distributors.Where(x => x.Address == "").ToList(); 
      return View(); 
     } 

     public ActionResult About() 
     { 
      //ViewBag.Message = "Your application description page.";z 

      return View(); 
     } 

     public ActionResult Contact() 
     { 
      //ViewBag.Message = "Your contact page."; 

      return View(); 
     } 

     public ActionResult Ordering() 
     { 
      //ViewBag.Message = "Place your orders." 

      return View(); 
     } 

     public ActionResult Inventory(string Categories) 
     { 
      //ViewBag.Message = "View items currently in stock."; 
      var categoriesModel = new Category 
      { 
       CatName = Categories, 
       Items = this.db.Items.ToList() 
      }; 
      return this.View(categoriesModel); 
     } 

     public ActionResult Item() 
     { 
      return View(); 
     } 


    } 
} 

이 (항목 내가 데이터를 표시 할 테이블 중 하나의 이름입니다) 항목 컨트롤러입니다 :

은 홈 컨트롤러입니다 데이터를 표시하려는보기 (텍스트 상자는 새로운 데이터 (예 : 주문 또는 이전 주문 검색)를 허용합니다.) :

내가 누락 된 것이 있습니까?

편집 :보기는 주문보기에 지수라는 항목에서이 코드 조각을 이동

Server Error in '/' Application. 

Compilation Error 

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. 

Compiler Error Message: CS0103: The name 'item' does not exist in the current context 

Source Error: 


Line 36: 
Line 37:  <td> 
Line 38:   @Html.DisplayFor(modelItem => item.UPC) 
Line 39:  </td> 
Line 40:  <td> 

Source File: c:\Users\Dragonfett\Documents\School\Spring 2014\CMPS 285\Group_6-CMPS_285\Vivace\Vivace\Views\Home\Ordering.cshtml Line: 38 


Show Detailed Compiler Output: 

Show Complete Compilation Source: 


Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34009 

: 나는 부분 뷰를 구현하기 위해,하지만 지금은 새로운 오류를 얻고있다 방법을 배웠 생각 :

<td> 
     @Html.DisplayFor(modelItem => item.UPC) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.ItemName) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Price) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Cost) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.MarkUp) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.OnHand) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.InWherehouse) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.OnOrder) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.OnFeature) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.ShelfCap) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Category1.CatName) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Department1.DeptName) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Distributor1.DistributorName) 
    </td> 
    <td> 
     @Html.ActionLink("Edit", "Edit", new { id = item.ItemNumber }) | 
     @Html.ActionLink("Details", "Details", new { id = item.ItemNumber }) | 
     @Html.ActionLink("Delete", "Delete", new { id = item.ItemNumber }) 
    </td> 

나는 분실했습니다.

답변

1

일반보기를 부분보기로 만듭니다.

각 컨트롤러에 대한보기마다 별도의 cshtml을 가지고 있지만 부분보기 만로드하면됩니다.

+0

그것은 자동으로 각각의 모든 컨트롤러에 대한 뷰를 생성, 난 그냥 때문에 얼마나 많은 거기의 예로서 작업 한 일을 보여 주었다. 이제 일반 뷰를 부분 뷰로 만드는 방법은 무엇입니까? – user3440006

0

ViewBag을 사용하여 한 테이블의 데이터를 저장하고 다른 테이블 데이터를 볼 모델로 전달하면서 View에 전달할 수 있습니다. 하지만 가장 좋은 방법은 뷰의 ViewModel 클래스를 만든 다음 해당 ViewModel 클래스를 Model (도메인) 클래스에 매핑하는 것입니다. ViewModel을 Model 클래스에 매핑하는 데 automapper를 사용하십시오.

http://www.codeproject.com/Articles/687061/Using-Multiple-Models-in-a-View-in-ASP-NET-MVC-M

관련 문제