C# 将数据从控制器传递到视图ASP.NET

C# 将数据从控制器传递到视图ASP.NET,c#,asp.net-mvc,asp.net-mvc-controller,C#,Asp.net Mvc,Asp.net Mvc Controller,我在将变量从控制器传递到视图时遇到问题。我已经创建了一个actionresult,允许用户将膳食添加到餐厅菜单中。我需要html操作链接中的menuID来访问菜单详细信息页面。但是,当我运行页面ViewData[“MenuID”]时,即使控制器操作结果中的MenuID有一个值,也会返回null。是否有其他方法将数据从控制器发送到视图 创建行动结果 [HttpPost] [ValidateAntiForgeryToken] public ActionResult C

我在将变量从控制器传递到视图时遇到问题。我已经创建了一个actionresult,允许用户将膳食添加到餐厅菜单中。我需要html操作链接中的menuID来访问菜单详细信息页面。但是,当我运行页面
ViewData[“MenuID”]
时,即使控制器操作结果中的MenuID有一个值,也会返回null。是否有其他方法将数据从控制器发送到视图

创建行动结果

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

        }
[HttpPost]
[ValidateAntiForgeryToken]
公共操作结果创建(MealviewModel模型,int?menuID)
{
if(menuID==null)
{
返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
其他的
{
ViewData[“MenuID”]=MenuID;
if(ModelState.IsValid)
{
var manager=newusermanager(newuserstore(newapplicationdbcontext());
var currentUser=manager.FindById(User.Identity.GetUserId());
var currentrestaurant=(从数据库Restaurants中的r开始)
其中r.UserID==currentUser.Id
选择r.First().id;
var currentmenu=(从数据库菜单中的m开始
其中m.Restaurantid==currentrestaurant
选择m).First().Id;
var MEIN=new MEIN(){Name=model.Name,Description=model.Description,Price=model.Price,MenuID=MenuID,Catergory=model.Catergory};
db.膳食.添加(膳食);
db.SaveChanges();
返回RedirectToAction(“Create”,new{MenudID=menuID});
}
}
返回视图();
}
创建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>
}
@model BiteWebsite.Models.MealviewModel
@使用BitewSite.Models;
@{
ViewBag.Title=“将项目添加到菜单”;
}
将项目添加到菜单中
@使用(Html.BeginForm())
{
变量ID=ViewData[“MenuID”];
@Html.AntiForgeryToken()

@Html.ValidationSummary(true) @LabelFor(model=>model.Catergory,新的{@class=“controllabel col-md-2”}) @DropDownList(“分类”,新的选择列表(新[]{“厨师特色菜”、“沙漠”、“饮料”、“主菜”、“配菜”, “开胃菜”、“沙拉”}) @LabelFor(model=>model.Name,新的{@class=“controllabel col-md-2”}) @EditorFor(model=>model.Name) @Html.ValidationMessageFor(model=>model.Name) @LabelFor(model=>model.Description,新的{@class=“controllabel col-md-2”}) @EditorFor(model=>model.Description,新的{@cols=“80”,@rows=“4”}) @Html.ValidationMessageFor(model=>model.Description) @LabelFor(model=>model.Price,新的{@class=“controllabel col-md-2”}) @EditorFor(model=>model.Price) @Html.ValidationMessageFor(model=>model.Price) @ActionLink(“查看菜单”、“菜单”、“详细信息”,新建{Id=Id}) }
因为您正在返回重定向操作。您应该使用tempdata或session变量将值保存在menuid中,当它是redirecttoaction时,它应该保存该值。

执行重定向时,您会丢失ViewData的内容。不过TempData是保留的,所以如果可能重定向,您可以使用它。我不了解ViewBag,所以您可以测试它。

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

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