1

基本的に、テキストボックス、ラジオボタン、チェックボックスコントロールを備えたフォームがあります。今、私は自分のページを送信するときにチェックボックス コントロールの問題に直面しています。私はこのようなモデルを持っています。

public class PersonDetails
{
    public int personID { get; set; }
    public string PersonName { get; set; }
    public string Gender { get; set; }
    public List<Education> Education { get; set; }
    public string EmailID { get; set; }
    public string Address { get; set; }

}

public class Education
{
    public string Qualification { get; set; }
    public bool Checked { get; set; }

    public List<Education> GetQualification()
    {
        return new List<Education>{
    new Education {Qualification="SSC",Checked=false},
    new Education {Qualification="HSC",Checked=false},
    new Education {Qualification="Graduation",Checked=false},
    new Education {Qualification="PostGraduation",Checked=false} 
    };
    }
}

そして、私はこのような見解を持っています

@using (Html.BeginForm("GetDetails", "User", FormMethod.Post, new { id = "person-form" }))
{
    <div class="col-xs-12">
    <label>Person Name</label>
    @Html.TextBoxFor(x => x.PersonName)
    </div>
    <div class="col-xs-12">
    <label>Gender</label>
    @Html.RadioButtonFor(x => x.Gender, "Male")
    @Html.RadioButtonFor(x => x.Gender, "Female")
    </div>
    <div class="col-xs-12">
    <label>Education</label>
    @{
    Html.RenderPartial("Qualification", new LearnAuthentication.Controllers.Education().GetQualification());
    }

    </div>

    <div class="col-xs-12">
    <input type="submit" value="Submit" />
    </div>
}

そして、このような部分的なビュー

@model List<LearnAuthentication.Controllers.Education>
<br />
@for (int i = 0; i < Model.Count(); i++)
{
    @Html.HiddenFor(x => Model[i].Qualification)
    @Html.CheckBoxFor(x => Model[i].Checked)
    @Html.DisplayFor(x => Model[i].Qualification)
<br />
}

私のアクションメソッドはこれです

[HttpPost]
public ActionResult GetDetails(PersonDetails personDetails)
{
    return View();
}

アプリを実行すると、すべての情報を取得する傾向がありますが、ページを送信すると、このプロパティが null 値で取得されます

公開リスト 教育 { get; 設定; }

私が間違っていることについて私を助けてくれる人はいますか、これを達成する方法について正しい道を教えてもらえますか。

4

1 に答える 1

1

コントロールを生成するためにパーシャルを使用すると、次のEducationような入力が生成されます。

<input type="hidden" name="[0].Qualification" ... />
<input type="hidden" name="[1].Qualification" ... />

ただし、バインドするには、モデルに一致する名前属性が必要です

<input type="hidden" name="Education[0].Qualification" ... />
<input type="hidden" name="Education[1].Qualification" ... />

パーシャルの名前をEducation.cshtml(クラスの名前と一致するように) 変更し、/Views/Shared/EditorTemplatesフォルダーに移動します (または/Views/yourControllerName/EditorTemplates、そのコントローラー専用の特定のテンプレートが必要な場合)。

次に、パーシャルを次のように変更します

@model LearnAuthentication.Controllers.Education

@Html.HiddenFor(m => m.Qualification)
@Html.LabelFor(m => m.Checked)
@Html.CheckBoxFor(m => m.Checked)
@Html.DisplayFor(m => m.Qualification)

そしてメインビューで置き換えます

<label>Education</label>
@{ Html.RenderPartial("Qualification", new LearnAuthentication.Controllers.Education().GetQualification()); }

<span>Education</span> // its not a label
@Html.EditorFor(m => m.Education)

コレクション内の各アイテムに対して正しいhtmlを正しく生成します

補足: 動作する他の代替手段は、POST メソッドのシグネチャを

[HttpPost]
public ActionResult GetDetails(PersonDetails personDetails List<Education> educationDetails)

または、部分ビューに渡されるネストされた複合オブジェクトから値を取得するHtmlFieldPrefixで説明されているように、を部分ビューに渡します。

于 2016-08-23T00:43:34.883 に答える