그래서 현재 ViewModels의 사용을 연구하고 분석 중입니다.MVC 5 : ViewModel/생성 용 전달 목록
내 응용 프로그램 (소위 "레스토랑")에서 "사용자"가 메뉴를 만들 수있는 기능이 필요합니다.
메뉴를 만들 때 : 이름을 선택하고 메뉴에 참여할 수있는 사람의 수를 선택할 수 있습니다. 그러나 식당에 이미있는 양의 요리를 추가 할 수도 있습니다. 이것은 체크 박스의 스타일과 끝에 'Create'버튼이 될 것입니다.
이것은 ViewModel을 사용해야한다는 것을 의미합니다. 저는 현재 요리의 메뉴를 창조 메뉴에 추가 할 수있는 가능성을 주려고합니다. 하지만 나는 for 루프에 갇혀 있고, 요리를 반복하는 데 사용됩니다. 또는 더 나은, 나는 전체 개념에 붙어있어 :
이미 만든 모든 요리를 CreateMenu보기에 표시하는 가장 좋은 방법은 무엇입니까? ViewBag에 추가 할 경우 ViewBag을 통해 반복 할 수 있습니까?
제가하고 싶은 일을 성공적으로 해보려고합니다. ViewModel을 기반으로 새 메뉴를 만들거나 추출 할 수 있습니까? 나는 이미 그것에서 요리의 목록을 사용하기 때문에 모델 (나는 모든 메뉴의 자신의 요리를 표시 다른보기에서) 정말 변경할 수 없습니다 - 내 코드에서
에서 메뉴가 있음을 유의하시기 바랍니다.
또한 내가 플랑드르에서 모든 것을 번역 때문에
모델
public class Menu
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Range(0,10)]
public int AmountPersons { get; set; }
[Range(0,double.MaxValue)]
public double Price { get; set; }
public virtual List<Dish> Dishes { get; set; }
}
public class Dish
{
[Required]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public enum Types { VOORGERECHT, HOOFDGERECHT, DRANK, DESSERT}
public Types Type { get; set; }
public double Price { get; set; }
public virtual List<Menu> Menus { get; set; }
public virtual List<Table> Tables { get; set; }
//Checked used for the 'checkbox' in the CreateMenu-View
[NotMapped]
public bool Checked { get; set; }
}
public class MenuViewModel
{
public Menu Menu { get; set; }
public List<Dish> AddedDishes { get; set; }
}
컨트롤러
public ActionResult CreateMenu()
{
MenuViewModel gm = new MenuViewModel();
// Assign ALL already created dishes to the list that the user can choose.
// AddedDishes is wrong? ViewBag preferred?
gm.AddedDishes = db.Dishes.ToList();
return View(gm);
}
// Add the Menu to all the Menu's in the Database.
[HttpPost]
public ActionResult MenuAanmaken(MenuModel gm)
{
// code to save the menu with all the added dishes to the database
// Conflict!? Cannot convert the MenuViewModel to the Menu-model How do we need to extract the Menu and the AddedDishes list
// to a menu and save that one to the database?
db.Menus.Add(gm);
return View(gm);
}
보기
,321, 잘못된 이름이나 데이터 맞춤법 오류의 가능성을 무시public class MenuViewModel<T>
{
public Menu Menu { get; set; }
public List<T> DishList { get; set; }
public MenuViewModel()
{
this.Lijst = new List<T>();
}
}
컨트롤러
public ActionResult CreateMenu(MenuViewModel<Dish> model)
{
model.DishList = db.Gerechten.ToList();
return View(model);
}
[HttpPost]
public ActionResult CreateMenu(MenuViewModel<Dish> model,List<Gerecht> SelectedList)
{
Menu t = new Menu();
t.Naam = gm.Menu.Naam;
t.AmountPersons = gm.Menu.AmountPersons;
t.Dishes = SelectedList;
db.Menus.Add(t);
return View("Menus", model);
}
: 0
,
편집이 _ UPDATE 좋아 (아래 참조) 그래서 내가 지금 가까운 것 같아 나는 다음과 같은 내 수업을 편집
리스트 작성 기능보기
@for (int i = 0; i < Model.DishList.Count(); i++)
{
<tr>
<td>
@Html.Label(Model.DishList[i].Naam)
<input type="hidden" [email protected]("DishList[{0}].Id", i) [email protected](i).Id />
<input type="hidden" [email protected]("DishList[{0}].Name", i) [email protected](i).Name />
<input type="checkbox" [email protected]("DishList[{0}].value", i) />
<input type="hidden" [email protected]("DishList[{0}].value", i) value="false" />
</td>
<br />
</tr>
}
ViewModels에 대한 약 10 개의 자습서를보고 난 후에이 작업을 수행했는데, 다음 방법은 처음 것보다 낫습니다. 나는 다음 접근 방식 일 것입니다 무슨 생각
: 내가 내 화면에서 다음을 얻을 수 있기 때문에
나는 그렇게 생각.나는 2 개의리스트 (viewmodel 중 1 개, 통과 된 1)를 비교하고 체크 박스 상태를 보려고 생각하고 있었습니까?
UPDATE 내 코드를 재 편집하지만 난 이해할 수가 없어 문제가 발견 스티븐 뮈크의 대답 후
. 당신이 만드는 경우, 그러나
// You have not indicated the 1-many table the dishes are saved to so adjust as required
MenuDish dish = new MenuDish()
{
MenuId = menu.ID,
DishId = dish
};
db.MenuDishes.Add(dish);
이었다 우리가 학교에서 배운 내용 :
대답은 내가 클래스와 형태의 1 일대 테이블의 위치에 있어야합니다 말한다 엔티티의 데이터 모델에 나열하면 연결된 테이블이 데이터베이스에 자동으로 생성됩니다. 그리고 그게 내 DB가 (MenuDish 클래스를 만들지 않고) 한 것입니다 :
MenuGerechts은 MenuDish를 의미합니다. 이것은 엔티티 프레임 워크가 자동으로 작성한 테이블입니다. 다음 질문에 대한 답입니다.
[HttpPost]
public ActionResult MenuAanmaken(MenuVM model)
{
if (!ModelState.IsValid)
{
return View(model);
}
IEnumerable<int> selectedDishes = model.Dishes.Where(x => x.IsSelected).Select(x => x.ID);
Menu menu = new Menu()
{
Naam = model.Name,
AantalPersonen = model.AmountPersons
};
foreach (int id in selectedDishes)
{
Dish g = db.Dishes.Find(id);
menu.Dishes.Add(g);
};
db.Menus.Add(menu);
db.SaveChanges();
return RedirectToAction("Menus", "Menu");
}
내가
Object reference not set to an instance of an object
오류가 나는 이유는 당연히 이해 해요 : 나는 다음에 컨트롤러를 다시 편집했습니다.
나는 Data-Model Menu 이후 이미 변경된 목록을 가지고있다. 이미 List of Dishes가있다. 그러나 S. Muecke의 대답을 가정 할 때, 이것은 New Class (일대 다 관계를 지원하기 위해 생성 된)의 사용을 제안하기 때문에 ViewModel을 푸는 올바른 방법이 아닙니다.
가 왜 불가능 여부를 권장 직접 메뉴 인스턴스에 선택한 요리를 추가하는 것입니다
이것은 다음과 같은 질문의 결론에 저를 가져온다?
데이터 모델에서 'MenuDish'테이블 사이에 항상 생성해야합니까?
다음 코드는 여전히 작동하는 새로운 메뉴의 생성 후 (보여주는 메뉴의 그들의 요리)?
컨트롤러 :
public ActionResult Menus()
{
List<Menu> menus = db.Menus.ToList();
return View(menus);
}
보기 :
@model IEnumerable<VBExamen.Models.Menu>
@{
ViewBag.Title = "Menus";
}
<h2>Menus</h2>
<p>
@Html.ActionLink("Create New Menu", "CreateMenu")
</p>
@foreach (var item in Model)
{
<table>
<ul>
<p>@Html.DisplayFor(modelItem => item.Name)</p>
@foreach (var g in item.Dishes)
{
<li>
@Html.DisplayFor(modelItem => g.Name)
</li>
}
</ul>
</table>
}
다음 출력:
이 작업을 수행하는 좋은 동기는 무엇일까요?
UPDATE 2
그래서 나는 내 프로젝트에서 다음을 포함했다 : - 그것은 이미 만들어지는 한 **
를 사용하기 위해 주석 는 ** 나는
Table()
을 사용했다 ** 모델 : **표 ("MenuGerechts")] 공용 클래스 MenuGerechts { [Key] [ForeignKey ("Menu")] public virtual int? MenuId {get; 세트; } public 가상 메뉴 메뉴 {get; 세트; }
[ForeignKey("Dish")] public virtual int? DishId { get; set; } public virtual Dish Dish { get; set; } }
은 그때 실제로 성공적으로 새로운 메뉴를 만들었습니다! 그러나 위의 그림에서 개요 메뉴 페이지로 이동하면 메뉴에 포함 된 식사 목록이 아닌 메뉴 이름 만 표시됩니다.
그러나 Database는 내 새로 만든 클래스에 MenuDish 링크 테이블을 사용하도록 허용하지 않았습니다. 새 메뉴를 만들었고 새 메뉴를 만든 다음 'old'메뉴를 사용하여 이전 메뉴의 이름을 '1'로 바꿉니다.
는 따라서 내가 왜 내 이전 질문을했다이이 운동에 내 모든 접근 방식을 뜻이었다 잘못
새로운 질문 :.? 내가 한 접시를 선택하는 경우 내 menuCreate 뷰 모델에만 작동? 왜 이렇게됩니까? llowing 오류가 The role 'MenuGerechts_Menu_Source' of the relationship 'VBExamen.Models.MenuGerechts_Menu' has multiplicity 1 or 0..1.
첫 번째로 이해해야 할 것은 뷰 모델이란 무엇입니까? (http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc)/뷰 모델에는 데이터 모델입니다. 'MenuViewModel'에는보기에 표시하고자하는'Menu'의 2 가지 속성과'DistViewModel'에'DishViewModel' 속성이 포함될 필요가있는'IList'속성이 있어야합니다. 여기에는 접시 ID, 이름 및 'bool' IsSelected '재산. –
답장을 보내 주셔서 감사합니다. Stephen,하지만 당신은'Menu'가 ViewModel에서 2 개의 속성을 필요로한다고 언급 했습니까? 'Menu '의 새로운 대상만으로 충분하지 않은가? 그리고 ViewModel은 다른 것과 상호 작용하는 것이 일반적입니까? 아니면 여기서 본 예나 인터넷에서 본 것을 많이 보지 못했기 때문에 이것은 단지 예외입니다. ** 마지막 질문. 당신은 뷰 모델은 데이터 모델이라는 속성을 결코 포함해서는 안되지만 새로운'Menu'에 추가 할 수있는 (데이터베이스로부터) 모든 요리를 보여줄 필요가 있기 때문에 제 경우에는 의무 사항이 아닙니다. 창조? –
[이 답변] (http://stackoverflow.com/questions/29542107/pass-list-of-checkboxes-into-view-and-pull-out-ienumerable/29554416#29554416)에서 뷰 모델, 컨트롤러 코드 및 뷰의 기본 구조. –