2

ユーザーからさまざまなタイプのさまざまな電話番号のリストを取得したい「ContactInfo」ビューがあります。ユーザーは、番号を追加、編集、および削除し、そのタイプを指定できる必要があります。少なくとも 1 つの携帯電話番号が必要です。

私はさまざまなアプローチを試みましたが、ある時点で行き止まりになりました。特定のバグを尋ねるよりも、シナリオ全体を説明して解決策を尋ねる方が効率的だと思いました。あなたの答えに感謝します。

これが私の電話クラスです:

public partial class Phone
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public string Number { get; set; }
    public PhoneNumberType Type { get; set; }

    public virtual User User { get; set; }
}

電話タイプの列挙型は次のとおりです。

public enum PhoneNumberType
{
    None,
    Mobile,
    Home,
    Work
}

これはビューのモデルです (タイプ コンボボックスを埋めるために、列挙型から電話タイプを入力するリストも含めました)。

public class ContactInfoModel
{

    public int Id { get; set; }

    public string EmailAddress { get; set; }
    public string Country { get; set; }
    public string Province { get; set; }
    public string County { get; set; }
    public string City { get; set; }
    public string Address { get; set; }
    public ICollection<Phone> Phones { get; set; }

    private IEnumerable<EnumMember> _phoneTypes;
    public IEnumerable<EnumMember> PhoneTypes
    {
        get
        {
            if (this._phoneTypes == null)
            {
                _phoneTypes = EnumUtility.GetEnumMembers(typeof(PhoneNumberType));
            }
            return _phoneTypes;
        }
    }
}

そして最後に、これはビューです:

@model Jobeteria.Models.JobSeekers.ContactInfoModel

@{ViewBag.Title = "Contact Information";}

@using (Html.BeginForm()){
@Html.AntiForgeryToken()
<header class="pages-header">
    <div class="pages-header-bg text-background"></div>
    <hgroup>
        <h1>@ViewBag.Title</h1>
    </hgroup>
</header>
<div class="pages-wide-column">
    <div class="pages-body-bg text-background"></div>
    <div class="pages-content-marginer">
        <fieldset>
            <legend>Contact Information</legend>
            <ol>
                <li>
                    @*view to manipulate phone numbers*@
                </li>
                <li>
                    @Html.LabelFor(model => model.EmailAddress)
                    @Html.EditorFor(model => model.EmailAddress)
                    <br/>
                    @Html.ValidationMessageFor(model => model.EmailAddress)
                </li>
                <li>
                    @Html.LabelFor(model => model.Country)
                    @Html.EditorFor(model => model.Country)
                    <br/>
                    @Html.ValidationMessageFor(model => model.Country)
                </li>
                <li>
                    @Html.LabelFor(model => model.Province)
                    @Html.EditorFor(model => model.Province)
                    <br/>
                    @Html.ValidationMessageFor(model => model.Province)
                </li>
                <li>
                    @Html.LabelFor(model => model.County)
                    @Html.EditorFor(model => model.County)
                    <br/>
                    @Html.ValidationMessageFor(model => model.County)
                </li>
                <li>
                    @Html.LabelFor(model => model.City)
                    @Html.EditorFor(model => model.City)
                    <br/>
                    @Html.ValidationMessageFor(model => model.City)
                </li>
                <li>
                    @Html.LabelFor(model => model.Address)
                    @Html.TextAreaFor(model => model.Address)
                    <br/>
                    @Html.ValidationMessageFor(model => model.Address)
                </li>
                <li class="horizontal-field">
                    <input type="submit" value="SAVE" />
                    <input type="reset" value="Cancel" onclick="javascript: history.back(1);"/>
                </li>
            </ol>
        </fieldset>
    </div>
</div>}
4

1 に答える 1

0

私はいつも Enumerable アイテムへのモデル バインディングが少し面倒だと思っています - それは本質的にあなたが達成しようとしていることです。

検証に関しては、ビュー モデルで使用するカスタム検証属性を記述します。これにより、少なくとも 1 つの電話番号が存在することが確認されます。

Phil Haack は、リストへのバインディングについてブログを書いています。

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

Phil の投稿から適応すると、次のようなことをする必要があると思います。

<% for (int i = 0; i < userPhoneNumeberCount; i++) { %>

  <%: Html.TextBoxFor(m => m.Phones[i].Number ) %>
  <%: Html.SelectListFor(m => m.Phones[i].Type, PhoneNumberSelectListData ) %> 
<% } %>
于 2012-11-26T13:04:33.370 に答える