0

ここに私のビューモデルがあります:

public class AgencyViewModel
{
    public int VendorId { get; set; }

    public IEnumerable<Vendor> Vendors { get; set; }

    public HttpPostedFileBase SpreadsheetFile { get; set; }
}

これが私の2つのコントローラーメソッドです。

public ActionResult Upload()
{
    var viewModel = new AgencyViewModel
    {
        Vendors = _vendorsRepository.Vendors.OrderBy(v => v.Name)
    };

    return View(viewModel);
}


[HttpPost]
public ActionResult Upload(AgencyViewModel viewModel)
{
    // do stuff
}

そして私の見解:

@model MyModels.AgencyViewModel

@using (Html.BeginForm("Upload", "Agencies", FormMethod.Post,
    new { enctype = "multipart/form-data" }))
{
    @Html.DropDownListFor(model => model.VendorId,
        new SelectList(Model.Vendors, "VendorID", "Name"),
        "- Select a Vendor -")

    @Html.TextBoxFor(model => model.SpreadsheetFile, new { type = "file" })

    <p>
        <input type="submit" value="Next" />
    </p>
}

に移動するUploadと、Vendorsが正しくロードされます。しかし、フォームを送信すると、ビュー モデルにはVendorIdandSpreadsheetFileVendorsisのみが含まれますnull

フォームを送信した後にコレクションを処理する必要がありVendors、すべてのデータを 2 回ロードしたくありません。

ビューモデルにデータを保持するにはどうすればよいですか?

4

2 に答える 2

2

ViewData を再度設定する必要があります。DRY のままにしておく場合は ActionFilter を使用できます。別の選択肢として、コントローラーの OnActionExecuted メソッドをオーバーライドして、そこにデータをロードします。

MVC パターンをうまく利用している場合は、検証が失敗した場合にのみビューデータをロードする必要があります。その場合、同じビューを再度ロードすることになるからです。

于 2013-01-10T04:22:00.373 に答える
0

フォームを送信した後、 name属性のみを使用して HTML コントロールの値を取得し、次のように html でレンダリングするドロップダウンリストを取得できます。

<select name="VendorId" id="VendorId"><option value="1">XYZ</option>

Vendors という名前のコントロールが作成されていないため、VendorId の値は取得できますが、Model.Vendors の値は取得できません。

このリストをセッションに保存するか、データベース プロシージャをもう一度呼び出して、フォームの送信後にリストを取得できます。

于 2013-01-10T10:16:37.440 に答える