在ASP.Net MVC3 Razor中将Viewbag数据从视图传递到控制器

13
在我的ASP.Net MVC3 Razor项目中,我需要从视图传递值到控制器。该视图包含一个提交按钮,用于传递所选的图像文件和另外两个输入数据。这两个输入数据来自名为“FileUpload”的控制器(ViewBag.Data1 = CusId; ViewBag.Data2 = Name;)。在提交按钮时,我必须将这三个参数(Image、CusId和Name)传递给另一个控制器以上传图像文件。
控制器代码
public ActionResult FileUpload(int CusId, string Name)
        {
            ViewBag.Data1 = CusId;
            ViewBag.Data2 = Name;

            return View();



        }

 [HttpPost]
        public ActionResult UploadPhoto(ElixiCustPro elixi, HttpPostedFileBase file)
        {

            //return null;
            try
            {
                if (file != null && file.ContentLength > 0)
                {
                    if ((file.ContentType == "image/jpeg") || (file.ContentType == "image/gif") || (file.ContentType == "image/png"))//check allow jpg, gif, png
                    {
                        elixi.Image = new byte[file.ContentLength];
                        file.InputStream.Read(elixi.Image, 0, file.ContentLength);
                        var filename = Path.GetFileName(file.FileName);
                        var path = Path.Combine(Server.MapPath("~/ElixirFiles/UploadImagesElixir/"), filename);
                        file.SaveAs(path);

                        ecp.Image = new byte[file.ContentLength];
                        ecp.ImageUrl = path;


                        ment.ElixiProData.Add(ecp);
                        ment.SaveChanges();
                        return RedirectToAction("ImageResult");
                    }
                }
            }
            catch (Exception ex)
            {
                return View(ex.Message.ToString());
            }


            return View();
        }

查看代码

@using (Html.BeginForm("UploadPhoto", "Home", FormMethod.Post,  new { @enctype = "multipart/form-data" }))
                    {
          @*              <div class="form-group">
                        <label class="col-lg-2 control-label">
                            Customer ID</label>
                        <div class="col-lg-10">@Html.TextBoxFor(model => model.CusId, new { @class = "form-control" })</div>

                        <label class="col-lg-2 control-label">
                            Customer Name</label>
                        <div class="col-lg-10">@Html.TextBoxFor(model => model.Name, new { @class = "form-control" })</div>
                        </div>*@
                        <input type="hidden" id="id" />
                        <div class="col-md-6">
                            <div class="form-group">
                                <label class="col-lg-2 control-label">
                                    DMIT Image</label>
                                <div class="col-lg-10">
                                     @ViewBag.Data1
                                     @ViewBag.Data2
                                    <input type="file" id="file" name="file">
                                    <input type="submit" class="btn btn-success" value="Upload" />
                                </div>
                            </div>
                        </div>
                    }
2个回答

17

ViewBag无法将数据传回控制器。您应在表单内部发布这些值。最简单的方法是不使用ViewBag,而是将数据添加到模型类型中。

然后,您可以使用HTML助手将它们作为隐藏输入传递,如下所示:

@Html.HiddenFor(item => item.CustomerId)
@Html.HiddenFor(item => item.ImageId)
如果不可能的话,您可以手动添加隐藏输入。只需记住,名称属性对于模型绑定非常重要。
<input type="hidden" name="CustomerId" value="@ViewBag.Data1" />

你好,在这个视图页面中我没有使用任何模型。 - Nidheesh
@Nidheesh 已更新答案。 - Ufuk Hacıoğulları
@Nick 隐藏输入只是方便提交表单数据的方式,而不是安全功能。您应该在服务器端验证每个输入。 - Ufuk Hacıoğulları
@Nick 你提到有人可能会检查代码..他们能否也更改值? - Nurul
你能像这样传递一个列表吗?对我来说似乎不起作用。 - user122222
显示剩余2条评论

13

是的,您不能将Viewbag从视图传递到控制器。 但是,您可以使用TempData传递它们。

将此添加到您的视图中。

@{TempData["Data1"]=ViewBag.Data1}
@{TempData["Data2"]=ViewBag.Data2}

但是这个TempData将信息作为一个对象传递。 因此,在控制器中需要进行类型转换。

int x=Convert.ToInt32(TempData["Data1"]);
string y=(TempData["Data2"]).ToString();

我尝试过了,它有效。

或者你可以在控制器中使用get方法发送TempData,并将其用于从视图传递到post方法,而不是使用Viewbag。


1
在tempdata赋值的大括号前面需要加上; - WhatsThePoint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接