Передача данных из контроллера для просмотра ASP.NET
У меня проблема с передачей переменной из контроллера в представление. Я создал actionresult, который позволяет пользователям добавлять блюда в меню ресторана. Мне нужен menuID в html-ссылке для доступа к странице с подробностями меню. Но когда я запускаю страницу ViewData["MenuID"]
возвращается как ноль, даже если 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>
}
3 ответа
Потому что вы возвращаете redirecttoaction. Вы должны использовать tempdata или переменную сеанса, чтобы сохранить значение в menuid, и оно должно содержать значение, когда это перенаправление.
Когда вы делаете перенаправление, вы теряете содержимое ViewData. Тем не менее, TempData сохраняется, поэтому вы можете использовать его, если возможен редирект. Я не знаю о ViewBag, так что вы можете проверить это.
Вы уже передаете другие значения через модель представления, почему бы не создать новое свойство в этой модели представления и не передать его в представление?