web-dev-qa-db-ja.com

ASP.Net MVC3 RazorでビューからコントローラーにViewbagデータを渡す

ASP.Net MVC3 Razorプロジェクトでは、ビューからコントローラーに値を渡す必要があります。ビューには、選択した画像ファイルと他の2つの入力データを渡すために使用される1つの送信ボタンが含まれています。この2つの入力データは、「FileUpload」というコントローラーからのものです(ViewBag.Data1 = CusId; ViewBag.Data2 = Name;)ボタンを送信するときに、これら3つ(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>
                    }
7
Nidheesh

ViewBagはデータをコントローラーに渡すことができません。これらの値はフォーム内に投稿する必要があります。最も簡単なのは、ViewBagを使用せずにデータをモデルタイプに追加することです。

次に、次のようなHTMLヘルパーを使用して、非表示の入力でそれらを渡すことができます。

@Html.HiddenFor(item => item.CustomerId)
@Html.HiddenFor(item => item.ImageId)

それが不可能な場合は、非表示の入力を手動で追加できます。名前属性はモデルバインディングにとって重要であることを覚えておいてください。

<input type="hidden" name="CustomerId" value="@ViewBag.Data1" />
13

はい、Viewbagをビューからコントローラーに渡すことはできません。ただし、TempDataを使用して渡すことができます。

これをビューに追加します。

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

ただし、このTempDataは情報をオブジェクトとして渡します。したがって、コントローラーでは型キャストが必要です。

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

私が試した、それは働いています。

または、getメソッドでControllerからTempDataを送信し、Viewbagの代わりに同じものを使用してビューからポストメソッドに渡すことができます。

9
Kranthi Kumar