-1

私は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 でこれを行う方法を検索するのが最善ですか?

4

3 に答える 3

2

AJAX を使用してファイルをアップロードすることはできません。何らかのサードパーティの回避策が必要です。Upload() メソッドから元のビューを、適切なモデルとともに返す必要があります。また、ViewBag 内のどこかにメッセージを表示するためのフラグも必要です。

public ActionResult Upload(UpdateDocumentModel model) {
...
  if (imagePath.Length > 247) {
    model.ErrorMessage = Errors.Over247;
    return View("UpdateDocument", model);
  }
...
return RedirectToAction("UploadOk");
}

読みやすくするために、厳密に型指定されたモデルに変更FormCollectionしました。さらに、それが MVC.net の目的です。これErrors.Over247は、プロジェクト内のどこかにある文字列リソース、またはビューが読み取って特定の HTML を表示するブール値フラグである可能性があります。

于 2013-05-30T08:02:04.197 に答える
0

ViewBag の代わりに TempData を使用するだけです

TempData["ErorrMessegge"] = "SomeMessage to view";


@TempData["ErorrMessegge"]
于 2013-05-30T08:18:00.320 に答える
0

以下のように、コントローラーからビューにパラメーターを渡すために、単純に TempData[] を使用できます。

コントローラ:

[HttpPost]
public ActionResult Add(Applicant applicant)
{
    repository.SaveApplicant(applicant);
    TempData["message"] = "The applicant has been saved succesfully.";
    return View(applicant);
}


意見:

@if (TempData["message"] != null)
{
    <div>@TempData["message"]</div>
}
于 2013-10-31T22:03:41.770 に答える