ソリューションへのアプローチ方法については、以下をご覧ください。
ステップ 1: 最初にサーバーにイメージを追加/アップロードする
2 つのアクション メソッドを作成して、1 番目はデータを保存し、2 番目は画像をアップロードします。たとえば、 SaveInformationでデータを保存し、UploadPictureで画像をアップロードします。
ユーザーがアップロードした画像を表示するコードの部分ビューを作成します。
すべての HTML があるメイン ビューで、フォーム タグを作成し、action 属性を割り当てて、SaveInformationアクション メソッドを呼び出します。
画像のアップロード ボタンで呼び出す必要がある JQuery 関数を作成します。この関数では、最初に action 属性を SaveInformation から UploadImage に動的に変更して、サーバーに画像をアップロードできるようにする必要があります。このタスクは、次のようなコードを記述して実行できます。
var action = "/ControllerName/UploadImage";
$("#IdOfYourFormTag").attr("action", action);
同じ関数で、JQuery ajax 呼び出しのコードを記述し、アクション メソッド UploadImage にヒットしてサーバーに画像をアップロードするフォームを送信します。同じアクション メソッド UploadImage で、新しい画像パスを渡して部分ビューを更新し、それを ajax 呼び出しの応答として返し、JQuery メソッドで Ajax 呼び出しの成功イベントを処理して部分ビューを更新します。
また、フォームタグにenctype = "multipart/form-dataピースのコードを追加してください。これがないと、ビューからコントローラーに画像を送信できなくなり、UploadImage アクションメソッドに 1 つのパラメーターHttpPostedFileBase FileUploadを追加して、ファイルを取得することもできます。
ステップ 2: 最後にイメージ パスをサーバーに永続的に保存する
- 画像のパスを格納するImagePathという名前のプロパティを作成します。
- 画像を表示するために作成した部分ビューに隠しファイルを作成し、それを ImagePath プロパティにバインドします。隠しフィールドをここに配置する背後にある考え方は、画像のアップロード時に新しい画像パスでも更新されるということです。
- フォームを送信して残りの情報を更新すると、この非表示フィールドから画像のパスも取得され、データベースに保存されます。
それで全部です。これがあなたを助けることを願っています。
まだ質問がある場合は、お気軽にお尋ねください。
編集:
まず最初に、Ajax 呼び出しを使用していないことをお伝えしたいと思います。ajax 呼び出しでは、セキュリティ上の理由から、アップロードする必要があるファイルの代わりに null 値が取得されます。Fileupload は通常の post メソッドで動作するか、いくつかの jquery プラグインを使用する必要があります。
では、まずModel を見てください:
モデルでは、ファイル パスを保持するプロパティを作成しました。
public class InformationModel
{
public string ImagePath { get; set; }
// Your rest of properties
}
意見:
@using (Html.BeginForm("SaveInformation", "Home",null, FormMethod.Post, new { id = "SaveInformation", enctype = "multipart/form-data" }))
{
@Html.HiddenFor(m => m.ImagePath)
<input type="file" name="FileUpload" id="FileUpload" />
<input type="button" id="Upload" name="Upload" value="Upload" />
<input type="submit" id="Submit" name="Submit" value="Submit" />
}
上記のコードでは、1 つのファイル アップロード コントロールと 2 つのボタン (ファイルをアップロードするボタン、フォーム全体を送信するボタン)、およびファイル パスを保持する隠しフィールドを持つフォームを作成しました。
ファイルをアップロードするだけで、jquery で次のようなコードを記述しました。
<script type="text/javascript">
$(document).ready(function () {
$("input#Upload").click(function () {
$("#SaveInformation").attr("action", "/Home/UploadImage");
$("#SaveInformation").submit();
});
});
</script>
上記のコードは、フォーム アクション メソッドをヒットからSaveInformationアクションではなく UploadImage アクション メソッドに変更し、フォームを送信するだけです。
コントローラ:
[HttpPost]
public ActionResult UploadImage(InformationModel model, HttpPostedFileBase FileUpload)
{
//First write your code here to Upload the image
string path = "/YourVirtualDirectoryPath/";
path = System.IO.Path.Combine(Server.MapPath(path), FileUpload.FileName);
FileUpload.SaveAs(path);
model.ImagePath = path;
//If you need to maintain the entire model you can do it like this or you can just assign the file path to the temp session
//and redirect to SaveInformation get method.
this.TempData["FilePath"] = model;
return RedirectToAction("SaveInformation");
}
上記の方法では、ファイルをアップロードし、画像パスを ImagePath プロパティに割り当て、モデルを一時セッション データに割り当てて、モデル値を保持し、コントロールを "SaveInformation" get メソッドにリダイレクトしました。これは、読み込みに使用しています。私たちのメインフォーム。
[HttpGet]
public ActionResult SaveInformation()
{
InformationModel model = null;
if (this.TempData["FilePath"] != null)
{
model = (InformationModel)TempData["FilePath"];
}
else
{
model = new InformationModel();
}
return View(model);
}
上記のアクション メソッドには単純なロジックが含まれており、リクエストが UploadImage アクション メソッドからのものである場合は、一時セッション データからモデルを埋めるか、新しいインスタンスを作成してビューをロードするだけです。
[HttpPost]
public ActionResult SaveInformation(InformationModel model)
{
return RedirectToAction("SaveInformation");
}
上記の方法は、すべての値を保存するだけです。[送信] ボタンをクリックすると、model.ImagePathに、残りの情報と共に保存する必要があるファイル パスが含まれていることがわかります。
問題の解決策が得られることを願っています。