5

チャンネルを作成できるページがあります。チャンネルにはジャンルが関連付けられています。

CreateChannel.cshtml
<h2>Create Channel</h2>

<div class="row-fluid">
<div>
    @{
        using (Html.BeginForm("CreateNewChannel", "Channel", new { channelId = Model.Id, userId = @Session["userId"] }, FormMethod.Post))
        {
            @Html.HiddenFor(model => model.Id)
            <h5>Name</h5>
            @Html.TextBoxFor(model => model.Name, new { @class = "input-block-level pull-left", type = "text", required = "required", placeholder = "Channel Name", style = "width: 400px" })
            @Html.ValidationMessageFor(model => model.Name, null, new { @class = "txt-error error-field", style = "padding-top: 4px" })
            <div class="clearfix"></div>
            <div style="width: 400px" class="input-block-level">
                <h5 style="">Description</h5>
                <div class="input-block-level">
                    @Html.TextAreaFor(model => model.Description, 5, 60, new { @class = "input-block-level", type = "textarea", required = "required", placeholder = "Description" })
                </div>
            </div>

            @Html.Action("SelectGenre", new { channelId = -1 })

            <button class="btn">Create</button>
        }
    }
</div>

SelectGenre.cshtml ビューは次のようになります。

<div id="genreDiv">
@Html.ListBoxFor(model => model.AvailableGenres, new MultiSelectList(Model.AvailableGenres, "Id", "Name"), new { size = "10" })

<input id="btnAddAll" type="button" value=" >> " onclick="addallItems();" />
<input id="btnAdd" type="button" value=" > " onclick="addItem();" />
<input id="btnRemove" type="button" value=" < "  onclick="removeItem();" />
<input id="btnRemoveAll"type="button" value=" << "  onclick="removeallItems();" />

@Html.ListBoxFor(model => model.ChosenGenres, new MultiSelectList(Model.ChosenGenres, "Id", "Name"), new { size = "10" })
</div>

<script type="text/javascript">
function addItem() {
    $("#AvailableGenres option:selected").appendTo("#ChosenGenres");
    $("#ChosenGenres option").attr("selected", false);
}
function addallItems() {
    $("#AvailableGenres option").appendTo("#ChosenGenres");
    $("#ChosenGenres option").attr("selected", false);
}
function removeItem() {
    $("#ChosenGenres option:selected").appendTo("#AvailableGenres");
    $("#AvailableGenres option").attr("selected", false);
}
function removeallItems() {
    $("#ChosenGenres option").appendTo("#AvailableGenres");
    $("#AvailableGenres option").attr("selected", false);
}
</script>

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

public class ChannelController : Controller
{
    public SelectGenreModel GetGenreModel(int channelId)
    {
        List<GuiGenre> chosenGenres;
        List<GuiGenre> availableGenres;
        using (RentItServiceClient proxy = new RentItServiceClient())
        {
            chosenGenres =     GuiClassConverter.ConvertGenres(proxy.GetGenresForChannel(channelId));
            availableGenres = GuiClassConverter.ConvertGenres(proxy.GetAllGenres()).Except(chosenGenres).ToList();
        }
        SelectGenreModel model = new SelectGenreModel
        {
            AvailableGenres = availableGenres,
            ChosenGenres = chosenGenres,
            ChannelId = channelId,
        };
        return model;
    }

    public PartialViewResult SelectGenre(int channelId)
    {
        return PartialView(GetGenreModel(channelId));
    }
}

public ActionResult CreateNewChannel(GuiChannel channel, int? userId, SelectGenreModel     model)
    {
        if (userId.HasValue)
        {
            channel.OwnerId = userId.Value;
            int channelId;
            using (RentItServiceClient proxy = new RentItServiceClient())
            {
                channelId = proxy.CreateChannel(channel.Name, userId.Value, channel.Description, new string[0]);
            }
            return RedirectToAction("SelectChannel", new { channelId = channelId, userId = userId });
        }
        return RedirectToAction("Index", "Home");
    }

SelectGenreModel は次のようになります。

public class SelectGenreModel
{
public List<GuiGenre> AvailableGenres { get; set; }
public List<GuiGenre> ChosenGenres { get; set; }
public int ChannelId { get; set; }
}

フォームを送信すると、SelectGenreModel の両方のリストが null になります。

これらのリストをビューに渡すにはどうすればよいですか?

4

1 に答える 1