передача данных от контроллера для просмотра ASP.NET

У меня проблема с передачей переменной из контроллера в представление. Я создал результат действия, который позволяет пользователям добавлять блюда в меню ресторана. Мне нужен menuID в ссылке действия html, чтобы получить доступ к странице сведений о меню. Но когда я запускаю страницу, ViewData["MenuID"] возвращает значение null, хотя menuID имеет значение в результате действия контроллера. Есть ли другой способ отправить данные из контроллера в представление?

Создать результат действия

[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>
}

person Dolaps    schedule 19.03.2014    source источник


Ответы (3)


потому что вы возвращаете redirecttoaction. вы должны использовать tempdata или переменную сеанса, чтобы сохранить значение в menuid, и оно должно содержать значение, когда это действие перенаправления.

person Baahubali    schedule 19.03.2014

Когда вы выполняете перенаправление, вы теряете содержимое ViewData. Однако TempData сохраняется, поэтому вы можете использовать его, если возможно перенаправление. Я не знаю о ViewBag, поэтому вы можете проверить это.

person jmcilhinney    schedule 19.03.2014
comment
FWIW, ViewData и ViewBag — это одно и то же, просто доступ к ним осуществляется по-разному. Вы можете поместить значение в ViewBag (например, ViewBag.SomeValue = 1) и извлечь его с помощью ViewData (например, ViewData[SomeValue]) и наоборот. - person Craig W.; 19.03.2014

Вы уже передаете другие значения через модель представления, почему бы не создать новое свойство в этой модели представления и передать его в представление?

person edgarpetrauskas    schedule 27.03.2014