質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

1245閲覧

データベースの特定の一部分だけ変更したくない場合の対処を教えてください

Aburamusi101064

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

1クリップ

投稿2021/11/20 14:57

編集2021/11/21 00:25

前提・実現したいこと

VisualStudioのMVCを使ってWEBページを作っています。使用言語はC#とhtmlです。
ブラウザの中で画像の添付を行って、ブラウザでその添付した画像を表示させています。ブラウザでは画像以外にも入力フォームが実装されていて、その中に添付された画像が表示されています。

発生している問題・エラーメッセージ

入力内容の保存をするときに、画像に変更がなかった場合も入力フォームに変更があればその部分だけでも保存したいのですが、そのまま保存すると元々あった画像が消えてしまいます。

該当のソースコード

Model public string PhotoName { get; set; } public byte[] PhotoContent { get; set; } [Display(Name = "写真1")] public byte[] Thumbnail { get; set; } public DateTime? TimeStamp { get; set; } [Display(Name = "写真2")] public string tenpu { get; set; }
Viewのhtmlで使用している主なコード @using (Html.BeginForm("Edit", "sinkis", FormMethod.Post, new { enctype = "multipart/form-data" })) <div class="form-group"> @Html.LabelFor(model => model.tenpu, htmlAttributes: new { @class = "control-label col-md-2" }) @Html.TextBox("data", "", new { type = "file", size = 20 }) </div>
controllerのC# public ActionResult Edit([Bind(Include = "Id,input,Photoname.PhotoContent,Thumbnail,TimeStamp,tenpu,sinseibi,uketukeNO,data")] sinki sinki, HttpPostedFileBase data) { if (ModelState.IsValid) { db.Entry(sinki).State = EntityState.Modified; db.SaveChanges(); //return RedirectToAction("Index"); } // //写真 if (ModelState.IsValid) { //ここに6行のif文追加予想 if(data == null) { db.sinki.Add(sinki); db.SaveChanges(); return RedirectToAction("Edit"); } var fileName = data.FileName; if (fileName.Length > 50) { fileName = fileName.Substring(0, 50); } //拡張子チェック var permit = new string[] { ".jpg", "jpeg", ".png", ".gif" }; if (!permit.Contains(Path.GetExtension(fileName.ToLower()))) { ViewBag.Message = "jpg, jpeg, png, gif以外のファイルはアップロードできません"; return View(); } //※SQLServerに保存 using (var reader = new BinaryReader(data.InputStream)) { var byteData = reader.ReadBytes(data.ContentLength); //サムネイル取得用にイメージに戻す System.Drawing.ImageConverter imgconv = new ImageConverter(); Image img = (Image)imgconv.ConvertFrom(byteData); int[] pils = img.PropertyIdList; int index = Array.IndexOf(pils, 0x501b); // サムネイル・データ if (index == -1) { // サムネイルの作成 Image thumbnail = img.GetThumbnailImage(160, 120, delegate { return false; }, IntPtr.Zero); // サムネイルの保存 sinki.Thumbnail = (byte[])imgconv.ConvertTo(thumbnail, typeof(byte[])); thumbnail.Dispose(); } else { // サムネイル・データの取得 PropertyItem pi = img.PropertyItems[index]; byte[] jpgBytes = pi.Value; sinki.Thumbnail = jpgBytes; } img.Dispose(); sinki.PhotoContent = byteData; } sinki.PhotoName = fileName; db.sinki.Add(sinki); db.SaveChanges(); } return View(sinki); }

試したこと

dataがnullな状態でもそれ以外を保存できればと思い、6行のif文を入れてみたのですが、これだけだと、画像がnullのままになってしまいますが、どう記述すればいいのかイメージが湧きません。もしくは根本的な考えが間違っているのでしょうか。
if(data == null)
{
db.sinki.Add(sinki);
db.SaveChanges();
return RedirectToAction("Edit");
}

開発環境

Microsoft Visual Studio2019
.NET Framework

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/20 15:11

まず、何はともあれ、コードは ``` と ``` で囲ってください (``` はバッククオート 3 つ)。インデントされて見易くなるので。 それから開発環境を書いてください。
Aburamusi101064

2021/11/20 15:37

コメントありがとうございます。初めての利用でしたのでインデントを知りませんでした。活用します。
退会済みユーザー

退会済みユーザー

2021/11/20 23:31 編集

開発環境としては、DB は何なのかとそのバージョン、Core か .NET Framework どっちかと、そのバージョンも書いてください。 DB のテーブルの構造を書いてください。 アップされたコードは断片的で重要なところが書かれてないし、逆に問題に関係無さそうな余計なところもあって、話が伝わらないです。 今のコードをそのまま貼ると長くなりすぎるのでそうしたと思いますが、であれば、問題を再現できる必要最低の簡単なサンプルを作って、Model, View, Controller のコードをすべて載せてください。そして、問題を再現する手順を書いてください。
退会済みユーザー

退会済みユーザー

2021/11/21 00:41

上のコメントを受けて質問を編集したようですが、話が伝わってますか? 依頼されたことに答えてもらえないのではこちらも答えられません。
退会済みユーザー

退会済みユーザー

2021/11/21 22:42

質問者さん、その後無言ですが、回答したのでそれに対するフィードバックを書きましょう。役に立った/立たなかったぐらいはすぐ返せるのでは? 役に立たなかったらどこが期待と違うかなどを書くと、よりあなたの期待に近い回答が得られるかも。とにかく無言は NG です。
guest

回答1

0

ベストアンサー

質問のコメントに対する返事が無いのでいろいろ不明ですが・・・

入力内容の保存をするときに、画像に変更がなかった場合も入力フォームに変更があればその部分だけでも保存したいのですが、そのまま保存すると元々あった画像が消えてしまいます。

たぶん DB には名前とか説明などと一緒に画像データのレコードが保存してあって、ASP.NET MVC アプリで Entity Framework を使ってレコードを取得して、名前とか説明とかだけを編集し、編集結果を DB に反映したいということであろうと想像してレスします。

「そのまま保存すると元々あった画像が消えてしまいます」というのは、編集画面から編集結果がサーバーに送信されてくるとき、画像のデーターが null になっているとかで、質問者さんのコードの、

db.Entry(sinki).State = EntityState.Modified; db.SaveChanges();

あたりで画像が null に上書きされてしまうからではないのですか?

であれば、以下の記事のように TryUpdateModel を試してみてください。

HttpPost Edit メソッドの更新
https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application#update-httppost-edit-method

記事に "既存のエンティティを読み取り、TryUpdateModel を呼び出して、ポストされたフォームデータのユーザー入力からフィールドを更新します" と書いてありますように、「既存のエンティティを読み取り」によって画像データも取得されるので、その上で名前とか説明とかだけを変更して SaveChanges を適用すれば望むことができると思います。

投稿2021/11/21 08:18

編集2021/11/21 12:15
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問