14

私はMVC 4とカミソリが初めてです。複数の部分ビューを含むビューがあります。部分ビューの機能により、これらを他のビューでも再利用する予定です。

私のモデルは、複雑なオブジェクトのコレクションです。

    public class EmployeeInfo
    {
        public EmployeeContactInfo contactInfo { get; set; }
        public List<TelephoneInfo> phoneDetails { get; set; }
        public AddressDetails addressDetails { get; set; }
    }

私のメイン ビューのモデルは でEmployeeInfoあり、他の部分ビューのモデルはそれぞれTelephoneInfoEmployeeContactInfoおよびAddressDetailsです。

RenderPartialを使用して、部分ビューをロードしようとしRenderActionました。Partial

    @using (Html.BeginForm())
    {
    @Html.Partial("ContactInfo",Model.contactInfo)
    }

メイン フォームが送信されると、メイン モデルには部分ビューの更新された値がありません。

これを検索したところ、以下の 2 つの提案されたソリューションが見つかりました。

  1. 使用EditorFor- 機能し、モデルが更新されますが、テキスト ボックスだけでなく、いくつかの内部操作 (アドレスの検索など) を持つ他のコントロールのコレクションもあり、同じ部分ビューを他の場所 (ユーザー コントロールなど) で再利用する必要もあります。従来の ASP.NET)

  2. RenderAction代わりに使用RenderPartial- 私にはうまくいきませんでした。

私が間違っているか、何かが間違って理解されている場合はお知らせください。

4

3 に答える 3

26

もう 1 つの選択肢は、エディター テンプレートを作成することです。たとえば、メイン ビューでは次のようになります。

@using (Html.BeginForm())
{
    @(Html.EditorFor(m => m.ContactInfo))
}

ここで、Views/Shared フォルダー (または、Views/Home などの Views/ControllerName フォルダー) に、"EditorTemplates" という名前の新しいフォルダーを作成します。その新しいフォルダーに、という名前の cshtml ビュー ファイルを作成しますEmployeeContactInfo.cshtml(ヒント、cshtml の名前は、データ型名、たとえばstringboolこの場合は顧客の連絡先情報の型である必要があります)。そのビューファイルに、次のようなものを入れます:

@model EmployeeContactInfo

@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email)

コントローラーにポストバックすると、返されたモデルの一部として値が含まれます。

于 2013-08-24T17:55:05.180 に答える
8

問題は、メイン フォームが contactInfo.property という名前の要素を予期していることです。おそらく、生成した名前の一部が適切な識別子のないプロパティである可能性があります。この問題により、MVC のデフォルト モデル バインダーで問題が発生します。カスタム モデル バインダーを作成することはできますが、大変な作業が必要です。または、より少ない作業で問題を解決する方法が 2 つあります。

1.生成された要素の名前を強制する

たとえば、EmployeeContactInfoクラスに文字列Addressプロパティが含まれている場合、次のヘルパーを使用する必要があります。

@Html.TextBox("contactInfo.Address", model.Address)

その結果:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" />

それ以外の:

@Html.TextBoxFor(m=> m.Address)

その結果:

<input type="text" name="Address" id="Address" />

2. モデル全体を渡します。

モデル全体を渡すと、生成された名前が正しいため、ヘルパーを使用できます。

@Html.TextBoxFor(m=> m.contactInfo.Address)

その結果:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" />
于 2013-08-24T17:28:22.173 に答える
-2

部分ビュー ページはユーザー コントロールのように機能します

  1. ここで _login.cshtml は部分ビューです
  2. 部分ビューを使用する場合は、アンダースコアの後に名前が続きます。

    <div style = "margin:3%;"> @Html.Partial("~/Views/Shared/_login.cshtml",Model.login)
    </div>

  3. Model.login はオブジェクトです。したがって、このオブジェクトでは、どのページでも値を割り当てることができます。

  4. オブジェクトの値に基づいて部分的に表示されます。

于 2013-12-26T14:54:38.500 に答える