1

メンバーに個人情報の提供を求めるフォームがいくつかあります。個人情報用の単一のモデルと、そのモデルを使用するための部分ビューがあります。いくつかのモデルは、PersonalInfo モデルをサブモデルとして使用します。

部分ビューで、正しい name 属性を使用して html をレンダリングできるようにしたいと考えています。正しくバインドするには、FirstName 入力タグの名前属性を「FirstName」ではなく「PersonalInfo.FirstName」にする必要があります。

データ注釈と目立たない検証を利用するため、Html.TextBoxFor を使用したいと考えています。Html.TextBox は、データ注釈の検証を実装していません。

または - Html.TextBox がデータ注釈を使用せず、クライアント側の検証を作成しない理由を誰かが教えてくれるかもしれません。

public class PersonalInfo {
    [Required(ErrorMessage = "First Name is required")]
    [StringLength(50, ErrorMessage = "First Name must be less than 50 letters")]
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

public class MemberModel {
    public string ShoeSize {get; set;}
    public PersonalInfo PersonalInfo {get; set;}
}

public class VolunteerModel {
    public string HairColor {get;set;}
    public PersonalInfo PersonalInfo {get; set;}
}

メンバー ビュー:

@model Member
using (Html.BeginForm()) {
    <h1>Member Info</h1>
    @Html.TextBoxFor(x => x.ShoeSize)
    @{Html.RenderPartial("_PersonalInfo", Model.PersonalInfo);}
}

ボランティア ビュー:

@model Volunteer
using (Html.BeginForm()) {
    <h1>Volunteer Info</h1>
    @Html.TextBoxFor(x => x.HairColor)
    @{Html.RenderPartial("_PersonalInfo", Model.PersonalInfo);}
}

個人情報の部分ビュー ... _PersonalInfo.cshtml:

@model PersonalInfo
@Html.TextBoxFor(x => x.FirstName)
@Html.TextBoxFor(x => x.LastName)

コントローラ:

public class MemberController : Controller
{
    public ActionResult Index()
    {
        return View(new MemberModel());
    }
    [HttpPost]
    public ActionResult Index(MemberModel model)
    {
        // model.PersonalInfo.FirstName should be set from user input at this point.
        // It is not set correctly when <input name="FirstName">.
        // It will work if <input name="PersonalInfo.FirstName">.
        return View(model);
    }
}

部分ビューでレンダリングされた Html コード:

<input class="basic-textbox focus" data-val="true" data-val-length="First Name must be less than 50 letters" data-val-length-max="50" data-val-required="First Name is required" id="FirstName" name="FirstName" type="text" value="Joseph" />

Html.TextBox を使用すると、クライアント側の検証が行われません。

@Html.TextBox("PersonEditorModel.FirstName", Model.FirstName)

結果:

<input id="PersonEditorModel_FirstName" name="PersonEditorModel.FirstName" type="text" value="Joseph" />
4

1 に答える 1

1

部分ビューの代わりに EditorTemplates を使用する必要があります。

Volunteer ビューに移動_PersonalInfo.cshtmlして変更する必要があります。Views\Shared\EditorTemplates\PersonalInfo.cshtml

@model Volunteer
using (Html.BeginForm()) {
    <h1>Volunteer Info</h1>
    @Html.TextBoxFor(x => x.HairColor)
    @Html.EditorFor(x => x.PersonalInfo) @* << change *@
}

詳細については、Dave Aが言及したブログ投稿を参照してください。EditorTemplates を示す Scott Hanselman による最近の記事もあります。

于 2013-03-29T20:26:01.067 に答える