私はasp.net mvc 3アプリケーションに取り組んでいます。データベースのデータに基づいてフォームを作成/表示し、このフォームに関連する画像をカスタム(私が作成した)画像ギャラリーに表示して、アップロードと削除を可能にする、2つの主な機能を持つ剃刀ビューを実装しています画像。
したがって、一般的に、これはフォームを視覚化し、画像を表示およびアップロードするための両方のフォームを使用した私のビューです。
@model List<DataAccess.MCS_DocumentFields>
@{
ViewBag.Title = "Документ";
}
<div id="alabala">
<div id="drawForm">
@using (Html.BeginForm("UpdateDocument", "Forms", FormMethod.Post))
{
<table border="1" id="drawDocument">
<colgroup>
<col span="1" style="width: 10%;" />
<col span="1" style="width: 40%;" />
<col span="1" style="width: 25%;" />
<col span="1" style="width: 25%;" />
</colgroup>
@Html.Partial("_PartialHeader", Model)
@Html.Partial("_PartialDrawing", Model)
@Html.Partial("_PartialBody", Model)
@Html.Partial("_PartialFooter", Model)
</table>
if (ViewBag.Status == 1)
{
<button type="submit" id="submitDocument">Запази</button>
<button style="float:right;" id="finalizeDocument">Приключи</button>
}
else
{
@Html.ActionLink("Назад", "Index")
}
}
</div>
<div id="imageContainer">
<div id="imageGallery" style="overflow: scroll">
<img src="file:\\..." alt="docImg" style="width: 190px; height: auto"/>
@Ajax.ActionLink("Delete", "DeletePicture", new { documentID = Model[0].Id },
new AjaxOptions
{
Confirm = "Are you sure?",
OnComplete = "$('#blah').attr('src', '#').attr('style', 'display:none;'); $('#Image1').attr('src', '#').attr('style', 'display:none;'); $('#DelPic').attr('style', 'display:none;');"
})
<img src="file:\\..." alt="docImg" style="width: 190px; height: auto"/>
@Ajax.ActionLink("Delete", "DeletePicture", new { documentID = Model[0].Id },
new AjaxOptions
{
Confirm = "Are you sure?",
OnComplete = "$('#blah').attr('src', '#').attr('style', 'display:none;'); $('#Image1').attr('src', '#').attr('style', 'display:none;'); $('#DelPic').attr('style', 'display:none;');"
})
</div>
@using (Html.BeginForm("Upload", "Forms", FormMethod.Post))
{
<input name=@Model[0].DocumentId type="hidden" />
<input type="file" name="datafile" id="file" onchange="readURL(this);" />
<input type="button" name="Button" value="Upload" id="UploadButton" onclick="fileUpload(this.form,'/forms/upload','upload'); return false;"/>
<div id="upload" style="display: inline-block;">
<img id="blah" src="#" alt="your image" style="display:none;"/>
</div>
}
</div>
</div>
最初のフォームは、現在のフォーム/ドキュメントのデータを表示する場所であり、編集可能であるため送信ボタンがあります。選択した画像をコントローラに送信し、そこでビジネス ロジックを実行するには、2 番目のフォームが必要です。
したがって、画像が選択されてUpload
ボタンがクリックされると、コントローラーに移動します。
public ActionResult Upload(FormCollection collection)
{
WebImage UploadImage = WebImage.GetImageFromRequest();
long documentID;
string finalImageName = null;
if (!long.TryParse(collection.AllKeys[0], out documentID))
//More code...
画像とそれが属するドキュメントのIDがあり、必要なのはいくつかのチェック/検証を実行し、最後に選択した画像を専用ディレクトリにコピーして名前をデータベースに保存することです。
問題は、次のようなさまざまな出力に対して正しいメッセージを表示するロジックを除いて、すべてのロジックを記述していることです。
if (imagePath.Length > 247)
{
//TODO message that the path is too long
//TODO this return View() is temp, replace with something suitable
return View();
}
//...
System.IO.File.Copy(UploadImage.FileName, imagePath);
}
catch (Exception ex)
{
//TODO copy failed return message
return View();
}
//...
これらはすべて、同じメソッドの実行からの異なる出力であり、メイン ビューでは、それぞれに適切なメッセージを表示したいと考えています。よくわからないのは、作業を保存してメッセージ ロジックを実装するオプションがまだあるかどうかです。今考えると、何らかの形で Ajax を使用していればずっと簡単にできるように思えますが、そうではありません。私が知っていると考えることができる唯一の考えは、作成することですViewBag
プロパティを表示し、モデルと共にそれをビューに戻し、さまざまなプロパティをチェックし、必要に応じてそれに基づいてメッセージを表示しますが、これは、ビューに多くの追加ロジックを意味し、既に表示されているデータベースからデータを再送信します私の見解と多くの二重作業は要するに、悪いプログラミングと見なすものですが、おそらく私はこれに夢中になりました。では、これからどうするのがベストなのか。コードを削除して、AJAX でこれを行う方法を検索するのが最善ですか?