2014-03-19 67 views
0

我遇到了将控制器变量传递给视图的问题。我创建了一个动作结果,允许用户在饭店菜单中添加餐点。我需要html操作链接中的menuID来访问菜单详细信息页面。但是当我运行页面ViewData["MenuID"]返回为null,即使menuID在控制器操作结果中有一个值。是否有另一种方式将数据从控制器发送到视图?从控制器传递数据以查看ASP.NET

创建行动结果

[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(); 

     } 

创建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

,因为你是返回一个redirecttoaction。您应该使用tempdata或会话变量将值保存在menuid中,并且该值应该在重定向动作时保存该值。

1

当您执行重定向时,将丢失ViewData的内容。 TempData被保留,所以你可以使用,如果重定向是可能的。我不知道ViewBag,所以你可以测试它。

+0

FWIW,ViewData和ViewBag是相同的东西,只是访问方式不同而已。您可以将值放入ViewBag(例如,ViewBag.SomeValue = 1)中,并使用ViewData(例如ViewData [“SomeValue”])将其拉出,反之亦然。 –

0

您已经通过视图模型传递了其他值,为什么不在该视图模型中创建一个新属性并将它传递给视图?

相关问题