3

どんな入力でも大歓迎です:)

MVC で複数の部分ビュー データを投稿できるかどうかを 1 つ知りたいですか?(部分ビュー データを DATABASE に更新したいという意味です)

例は次のとおりです。

モデル:-

public class PassengerViewModel
{
    public List<PassengerModel> Passengers { get; set; }
    public ContactModel Contact { get; set; }
}

コントローラ:-

[RequiredAuthentication]
    public ActionResult Passenger()
    {
        var passengrViewMdl = new PassengerViewModel()
        {
            Contact = new ContactModel(),
            Passengers = psngrService.LoadPassengers(Convert.ToInt32(Session["LPORefNO"]))
        };
        return View(passengrViewMdl);
    }
    [HttpPost]
    public ActionResult Passenger(PassengerViewModel passengerViewModel)
    {
        Here i want to update Passengers & Contact information
    }

意見:-

@model QR.LPO.Core.Models.PassengerViewModel
@{
ViewBag.Title = "Add Passengers";
}
@using (Html.BeginForm())
{
@Html.Partial("_Passenger", Model.Passengers);
@Html.Partial("_PassengerContact", Model.Contact);
<input type="submit" value="Submit" />
}

ありがとう。

4

2 に答える 2

1

はい、確かに可能ですが、コントローラーは通常、リクエストごとに1つのモデルでのみ機能するため、モデル内で両方の部分サブモデルのプロパティを宣言するか、サブモデル自体を宣言する必要があります。

これは、HTML仕様により可能であり、送信ボタンを持つフォーム上のすべてのデータが送信アクションURLに送信されます。

于 2012-04-06T07:48:18.850 に答える
1

これは、ほぼそのままで機能します。これを妨げるパーシャル固有のものは何もありません。最終的に重要なのは、出力される html だけです。

コードの問題は、おそらくビューのモデル_Passengerがタイプであり、ビューPassengersのモデルがタイプであることです。これが意味することは、標準の拡張機能 (またはそれらが生成するフィールドのようなもの) の場合、 のような完全な名前ではなく、モデルに関連する名前だけを持つということです。これにより、post アクションでモデルバインディングが失敗します。_PassangerContactContactHtmlHelperHtml.Textbox(...)Html.TextboxFor(...)Contact.NameName

これはいくつかの方法で解決できます。

  1. サブビューで同じモデル タイプ ( PassengerViewModel) を使用し、 のようなコードを記述します@Html.TextboxFor(m => m.Contact.Name)

  2. を使用する代わりに、 をHtml.Partial使用してHtml.EditorFor(...)ください。これにより、適切なプレフィックス情報が子ビューに渡されるため、フィールド名が適切に生成されます。

  3. 自分で明示的にプレフィックスを設定する

このような:

@{
    var childViewData = new ViewDataDictionary(this.ViewData);
    childView.TemplateInfo.HtmlFieldPrefix = "Contact";
}
@Html.Partial("_PassengerContact", Model.Contact, childViewData)

Html.PartialForこのスタックオーバーフローの質問で説明されているように、自分でオーバーロードを作成することもできます: ASP.NET MVC 部分ビュー: 入力名プレフィックス

于 2012-04-06T08:07:11.380 に答える