0

コントローラでオブジェクトを受け取らない理由を理解できません。ここから例に従いました:http ://www.aspnetmvcninja.com/views/asp-net-mvc-select-list-example

鉱山は次のようになります:
コントローラー

private List<webpages_Roles> GetOptions()
    {
        List<webpages_Roles> categories = new List<webpages_Roles>();
        foreach (Models.webpages_Roles databaseRole in Securitydb.webpages_Roles.ToArray())
        {
            categories.Add(new webpages_Roles() { RoleName = databaseRole.RoleName, RoleId = databaseRole.RoleId });
        }        

        return categories;
    }

    public ActionResult Users2()
    {
        UserProfile user = new UserProfile();
        user.UserId = 24;
        user.UserName = "Alan";
        user.webpages_Roles.Add(new webpages_Roles { RoleName = "Administrator", RoleId = 1 });
        ViewBag.Categories = GetOptions();
        return View(user);
    }

    [HttpPost]
    public ActionResult Users2(UserProfile user)
    {
        ViewBag.Categories = GetOptions();
        return View(user);
    }

モデル

public partial class webpages_Roles
{
    public webpages_Roles()
    {
        this.UserProfiles = new HashSet<UserProfile>();
    }

    public int RoleId { get; set; }
    public string RoleName { get; set; }

    public virtual ICollection<UserProfile> UserProfiles { get; set; }
}
public partial class UserProfile
{
    public UserProfile()
    {
        this.webpages_Roles = new HashSet<webpages_Roles>();
    }

    public int UserId { get; set; }
    public string UserName { get; set; }

    public virtual ICollection<webpages_Roles> webpages_Roles { get; set; }
}

見る

@model Models.UserProfile

@{
    ViewBag.Title = "Users2";
}
<div>
<h1>Select Values</h1>
<ul>
@foreach (Models.webpages_Roles c in Model.webpages_Roles)
   {
   <li> @c.RoleId </li>
 }
</ul>
@Html.DisplayForModel()

@Html.HiddenFor(x => x.webpages_Roles)

<h1>Change Values</h1>
@using (Html.BeginForm())
   {
   @Html.ListBoxFor(x => x.webpages_Roles, new MultiSelectList(ViewBag.Categories, "RoleId", "RoleName", Model.webpages_Roles));
   <br />
   <input type="submit" value="Submit" />
 }
    </div>

リストで変更を選択して送信ボタンを押した後

public ActionResult Users2(UserProfile user)

ユーザーは空です。UserProfileの各プロパティに非表示フィールドを使用してみましたが、動作に変更はありません。

4

1 に答える 1

1

ビューでは、モデルのすべてのプロパティをフォームでラップする必要があります。フォームを送信すると、ListBox 値のみが取得され、UserProfile オブジェクトと一致しません。だからそのようなことをしてください:

@model GEMPlus.Models.UserProfile

@{
    ViewBag.Title = "Users2";
}
<div>
    <h1>Select Values</h1>
    @using (Html.BeginForm())
    {
        <ul>
            @foreach (GEMPlus.Models.webpages_Roles c in Model.webpages_Roles)
            {
                <li> @c.RoleId </li>
            }
        </ul>
        @Html.DisplayForModel()

        @Html.HiddenFor(x => x.webpages_Roles)
            @Html.HiddenFor(x => x.RoleId)

        <h1>Change Values</h1>
        @Html.ListBoxFor(x => x.webpages_Roles, new MultiSelectList(ViewBag.Categories, "RoleId", "RoleName", Model.webpages_Roles));
        <br />
        <input type="submit" value="Submit" />
    }
</div>

少なくとも HiddenFor 要素がフォーム内にあることを確認してください。DisplayFor は大きな違いはありません。また、RoleId を非表示としてフォームに含めてください。

フォーム内に配置する必要がある正確な要素については正しくありませんが、問題はその領域にあります-送信されたフォームには、オブジェクトにマップするのに十分な情報がありません.

于 2012-09-14T10:41:00.863 に答える