2014-03-19 18 views
0

컨트롤러에서보기로 변수를 전달하는 데 문제가 있습니다. 나는 사용자가 레스토랑 메뉴에 식사를 추가 할 수있는 actionresult를 만들었습니다. 메뉴 세부 정보 페이지에 액세스하려면 HTML 동작 링크에서 menuID가 필요합니다. 그러나 페이지 ViewData["MenuID"]을 반환하면 menuID에 컨트롤러 작업 결과 값이 있어도 null로 반환됩니다. 컨트롤러에서보기로 데이터를 보내는 다른 방법이 있습니까?컨트롤러에서 ASP.NET으로 데이터를 전달합니다.

당신이 redirecttoaction를 반환하기 때문에 CSHTML 페이지

@model BiteWebsite.Models.MealviewModel 
@using BiteWebsite.Models; 

@{ 
    ViewBag.Title = "Add Items to Your Menu"; 
} 

<h2>Add Items to Your Menu</h2> 

@using (Html.BeginForm()) 
{ 

    var ID = ViewData["MenuID"]; 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <hr /> 
     @Html.ValidationSummary(true) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.Catergory, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownList("Catergory", new SelectList(new[] {"Chef Specials","Deserts","Drinks","Main Courses","Sides", 
                   "Starters" ,"Salads"})) 
      </div> 
     </div> 
     <div class="form-group"> 
      @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Name) 
       @Html.ValidationMessageFor(model => model.Name) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Description, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Description, new { @cols = "80", @rows = "4" }) 
       @Html.ValidationMessageFor(model => model.Description) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.Price, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Price) 
       @Html.ValidationMessageFor(model => model.Price) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Add Item" class="btn btn-default" /> 
       <div class="btn btn-default"> 
        @Html.ActionLink("View Menu", "Menu", "Details", new { Id = ID }) 
       </div> 
      </div> 

     </div> 
    </div> 
} 

답변

1

만들기 활동 결과

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(MealviewModel model, int? menuID) 
     { 
      if (menuID == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      else 
      { 
       ViewData["MenuID"] = menuID; 
       if (ModelState.IsValid) 
       { 
        var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
        var currentUser = manager.FindById(User.Identity.GetUserId()); 


        var currentrestaurant = (from r in db.Restaurants 
              where r.UserID == currentUser.Id 
              select r).First<Restaurant>().id; 

        var currentmenu = (from m in db.Menus 
             where m.Restaurantid == currentrestaurant 
             select m).First<Menu>().Id; 
        var meal = new Meal() { Name = model.Name, Description = model.Description, Price = model.Price, MenuID = menuID, Catergory = model.Catergory }; 

        db.Meals.Add(meal); 
        db.SaveChanges(); 
        return RedirectToAction("Create", new { MenudID = menuID }); 

       } 
      } 
      return View(); 

     } 

을 만듭니다. 당신은 메뉴 ID에 값을 저장하기 위해 tempdata 또는 세션 변수를 사용해야하며, 그것은 redirecttoaction 일 때 값을 유지해야합니다.

1

리디렉션을 수행하면 ViewData의 내용이 손실됩니다. TempData는 유지되지만 리디렉션이 가능한 경우 사용할 수 있습니다. ViewBag에 대해 알지 못해서 테스트 할 수 있습니다.

+0

FWIW, ViewData 및 ViewBag는 동일한 점을 제외하고는 다르게 액세스했습니다. ViewBag에 값 (예 : ViewBag.SomeValue = 1)을 넣고 ViewData (예 : ViewData [ "SomeValue"])를 사용하여 값을 가져올 수 있으며 그 반대의 경우도 마찬가지입니다. –

0

이미 다른 값을 뷰 모델을 통해 전달하고 있는데, 해당 뷰 모델에서 새 속성을 만들어 뷰에 전달하는 것이 좋습니다.

관련 문제