0

厳密に型指定されたモデルを使用して部分ビューを作成しています。この部分図にはフォームがあります。フォームを送信すると、部分ビューが同じモデルに基づいてすべての要素をレンダリングしたためではないにもかかわらず、モデル内のオブジェクトが null であることがわかります。

より具体的には、すべてのチェックボックスを戻すのに問題があります。私のコントローラーを見ると、CompanyOptionsが null かどうかをチェックしていることがわかります。プログラムを実行するたびに、STUFF IS NULLそれが null であることを意味します。

モデル:

public class Company
{
    public string Name { get; set; }
    public string DatabaseName { get; set; }
    public CompanyOptions CompanyOptions;
}

 public class CompanyOptions
    {

        public CompanyLicenseOptions CompanyLicenseOptions { get; set; }
    }

 public class CompanyLicenseOptions
    {
        public List<CompanyLicenseOption> CompanyLicenseOptionsList;
}

意見:

@using (Html.BeginForm("Action", FormMethod.Post))
{
    for (int i = 0; i < Model.CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList.Count; i++)
    {
        @Html.CheckBoxFor(model => model.CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[i].IsLicensed, checkboxHtmlAttributes);
        <label for="@Model.CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[i].LicenseName">@Model.CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[i].LicenseName</label>                                                                                       
        <br/>
    } 
    @Html.HiddenFor(model => model.DatabaseName)
    <input id="submit_licenses" type="submit" style="display:none;" />
}

コントローラ:

       [HttpPost]
        public void Action(Company model)
        {
            System.Diagnostics.Debug.WriteLine("STUFF:" + model.DatabaseName);
            if(model.CompanyOptions!=null)foreach (var item in model.CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList) System.Diagnostics.Debug.WriteLine("STUFF:" + item);
            else System.Diagnostics.Debug.WriteLine("STUFF IS NULL");
        }

生成された HTML:

<input class="licenses" data-val="true" disabled="" id="CompanyOptions_CompanyLicenseOptions_CompanyLicenseOptionsList_0__IsLicensed" name="CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[0].IsLicensed" type="checkbox" value="true" /><input name="CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[0].IsLicensed" type="hidden" value="false" />

無関係な JS

$('#save_licenses').click(function () {
        swap_licenses(true);
        $('#submit_licenses').click();
    });

役職:

Request URL:http://localhost:3080/Controller/Action
Request Method:POST
Status Code:200 OK

CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[0].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[1].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[2].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[3].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[4].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[5].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[6].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[7].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[8].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[9].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[10].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[11].IsLicensed:false
    CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[12].IsLicensed:false
    DatabaseName:myDb
4

3 に答える 3

2
<input class="licenses" data-val="true" disabled="" id="CompanyOptions_CompanyLicenseOptions_CompanyLicenseOptionsList_0__IsLicensed" name="CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[0].IsLicensed" type="checkbox" value="true" /><input name="CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList[0].IsLicensed" type="hidden" value="false" />

問題は次のとおりです。

disabled=""

あなたのチェックボックスはdisabledであるため、サーバーには何も送信されません。それが HTML の仕組みです。無効な要素は送信されません。したがって、この属性を取り除きます。

ユーザーが値を変更できないようにしたいが、初期値がサーバーに送信される場合はreadonly、 ではなく 属性を使用しますdisabled

また、あなたのコードで見られる別の問題は、CompanyLicenseOptionsListコレクション フィールドにあります。public getter と setter を持つプロパティである必要があります。

public class CompanyLicenseOptions
{
    public List<CompanyLicenseOption> CompanyLicenseOptionsList { get; set; }
}

同じことがフィールドにも当てはまりますCompanyOptions(フィールドとして定義しましたが、プロパティである必要があります):

public class Company
{
    public string Name { get; set; }
    public string DatabaseName { get; set; }
    public CompanyOptions CompanyOptions { get; set; }
}

アップデート:

不足しているゲッターとセッターの問題を修正したので、あとは、このオブジェクト グラフに介入するすべてのモデルにデフォルト (パラメーターなし) のコンストラクターがあることを確認するだけです。アクション引数として表示する場合は、これが必要です。そうしないと、デフォルトのモデル バインダーがそれらをインスタンス化する方法がわからないためです。何らかの理由ですべてのオブジェクトに既定のコンストラクターを追加できない場合は、オブジェクト階層を修正して、すぐにビュー モデルの使用を開始することを強くお勧めします。

于 2013-01-23T21:22:51.223 に答える
0

次のように、単純な for の代わりに foreach ループを使用する必要があります。

@using (Html.BeginForm("Action", FormMethod.Post))
{
    foreach (var option in Model.CompanyOptions.CompanyLicenseOptions.CompanyLicenseOptionsList)
    {
        @Html.CheckBoxFor(o => o.IsLicensed, checkboxHtmlAttributes);
        <label for="@option.LicenseName">@option.LicenseName</label>                                                                                       
        <br/>
    } 
    @Html.HiddenFor(model => model.DatabaseName)
    <input id="submit_licenses" type="submit" style="display:none;" />
}
于 2013-01-23T21:14:29.243 に答える
-1

これらすべてのチェックボックスのエンドポイントは であるため、List<T>使用前にインスタンス化されていることを確認する必要があります。

public class CompanyOptions
{
    public CompanyLicenseOptions CompanyLicenseOptions { get; set; }
}
public class CompanyLicenseOptions
{
    public List<CompanyLicenseOption> CompanyLicenseOptionsList;
    public CompanyLicenseOptions() 
    {
         CompanyLicenseOptionsList = new List<CompanyLicenseOption>();
    }
}

編集: 読者がこの回答の適切なコンテキストを取得し、混乱を避けるために、上記の OP コードを再現しました。

于 2013-01-23T21:40:32.530 に答える