1

MultiSelectListコード ビハインド モデルの dataValueField が数値であり、dataTextField フィールドが文字列である があります。

結果のhtmlselect要素で複数の値を選択すると、フィールドがmust be a number. バッキング フィールドは整数であり、複数のエントリを選択すると、建物の ID 値がコンマを使用して連結されるため、これは理にかなっています。これに対する回避策は何ですか?ありがとう。

モデルは以下の通り。

// Selected buildings are stored in this table.
public class ClientSelectedBuildings
{
    public int ClientSelectedBuildingsId { get; set; }
    // ...
    [Display(Name = "Please select the buildings under consideration.")]
    public int? BuildingId { get; set; }
}

// Building list is retrieved from this table.
public class Buildings
{
    public int BuildingsId { get; set; }
    // ...
    [StringLength(255)]
    public string BuildingName { get; set; }
}

私の見解は次のようになります。

@model TheApplication.Models.ClientSelectedBuildings
    <div class="outer">
        <div class="inner">
            @Html.LabelFor(t => t.BuildingId)
            @Html.ListBoxFor(t => t.BuildingId, (MultiSelectList)ViewBag.Buildings, new { size = "4" })
            @Html.ValidationMessageFor(t => t.BuildingId)
        </div>
    </div>
4

1 に答える 1

2

問題は、ドメイン モデルが 1 つの BuildingId のみを許可しているにもかかわらず、フォームがリスト ボックスを介して複数を送信しようとすることです。

これは、ドメイン モデルがビュー モデルと完全に一致しない完璧な例です。ドメインとビューにはそれぞれ異なる懸念があり、非常に基本的な CRUD の状況以外では、フォーム ビューには常に別のモデルが必要であることがわかります。

(カスタム モデル バインダーなしで) ClientSelectedBuildings に直接バインドすることはできません。代わりに、複数の ClientSelectedBuildings にマップできる中間モデルにバインドします。

// Here's the model submitted from the view. This will have to be mapped to domain
// entities.
public class FormModel
{
    // ... Other form fields ...

    public int[] BuildingIds { get; set;

    // ... Other form fields ...
}


// Example controller action that processes the form input.
[HttpPost]
public ActionResult MyPostAction(FormModel input)
{
    if (ModelState.IsValid)
    {
        // Loop all submitted building ids, map the data into domain entities.
        foreach(var buildingId in input.BuildingIds)
        {
            // Create the domain entity.
            var selected = new ClientSelectedBuildings
            {
                ClientSelectedBuildingsId = ... Wherever this comes from ...
                BuildingId = buildingId;
            };

            // Add to the data repository.
            this.MyDbContext.ClientSelectedBuildings.Add(selected);
        }

        // Submit all changes to the data context.
        this.MyDbContext.ClientSelectedBuildings.SaveChanges();

        // ... Return redirect to success view ...
    }

    // ... Return error view ...
}
于 2013-06-10T17:38:21.277 に答える