Страница с несколькими кнопками отправки и одним методом Get / Post Action - PullRequest
0 голосов
/ 02 декабря 2011

Я новичок в MVC, поэтому, пожалуйста, прости меня, если я так нуб :).

В моем новом проекте я хочу создать страницу «Создать песню», которая, конечно же, создает новую песню. В моделировании одной песни может быть много исполнителей. Таким образом, на странице создания песни пользователь должен иметь возможность искать исполнителей и добавлять исполнителей из результатов поиска, нажимая ссылки «Добавить» исполнителей в результатах поиска.

В настоящее время у меня есть две кнопки отправки в форме: «Отправить» и «SearchArtist», и они вызывают метод действия «Создать» http POST. Объект ViewModel (CreateSongScrnData) используется для публикации данных экрана. И все работает нормально. Но когда я пытаюсь добавить исполнителя из результата поиска Artist, используя @Url.Action, передавая данные ViewModel в метод http «Создать», параметр объекта viewmodel всегда равен нулю, когда он входит в метод actiona. Пожалуйста, помогите мне советом и просветите меня, если я упускаю некоторые понятия. Заранее большое спасибо.

Код выглядит следующим образом.

public ActionResult Create(CreateSongScrnData modelData, Int32? artistIDToAdd)
    {
        if (modelData != null && artistIDToAdd != null)
        {
            var artist = db.Artists.Find(artistIDToAdd);
            modelData.Song.Artists.Add(artist);
        }
        ViewBag.GenreID = new SelectList(db.Genres, "GenreID", "Name");
        ViewBag.AlbumID = new SelectList(db.Albums, "AlbumID", "Name");
        return View(modelData);
    } 

    [HttpPost]
    public ActionResult Create(CreateSongScrnData modelData)
    {
        switch (modelData.SubmitCommand)
        {
            case "AddNewSong":
                if (ModelState.IsValid)
                {
                    db.Songs.Add(modelData.Song);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                break;
            default:
                modelData.SearchResult = db.Artists.Where(a => a.Name.Contains(modelData.ArtistSearchString)).ToList();
                break;
        }
        ViewBag.GenreID = new SelectList(db.Genres, "GenreID", "Name", modelData.Song.GenreID);
        ViewBag.AlbumID = new SelectList(db.Albums, "AlbumID", "Name", modelData.Song.AlbumID);
        return View(modelData);
    }

Фрагмент кода поиска в представлении выглядит следующим образом:

<h2>Create</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
    <div class="editor-label">
        @Html.LabelFor(model => model.Song.Name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Song.Name)
        @Html.ValidationMessageFor(model => model.Song.Name)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Song.MyanmarName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Song.MyanmarName)
        @Html.ValidationMessageFor(model => model.Song.MyanmarName)
    </div>

    <div class="editor-label"> 
        @Html.LabelFor(model => model.Song.Genre)
    </div>
    <div>
        @Html.DropDownList("GenreID", "Choose Genre")
        @Html.ValidationMessageFor(model => model.Song.GenreID)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Song.AlbumID, "Album")
    </div>
    <div class="editor-field">
        @Html.DropDownList("AlbumID", "Choose Album")
        @Html.ValidationMessageFor(model => model.Song.AlbumID)
    </div>
    <div class="editor-label"> 
    <p>Sing by this artists:</p>
    @if (Model.AddedArtists != null)
    {
     <table><tr><th>Name</th></tr>
        @foreach (var item in Model.AddedArtists)
        {
                <tr><td>@item.Name</td></tr>
        }
    </table>
    }
    </div>

    <div style=" border-top:1px solid #ccc; width: 400px; height:auto; margin-top:30px; margin-bottom:30px;"></div>
    <div>
        <p>Search and add artists</p>
        @Html.TextBoxFor(model => model.ArtistSearchString)
        <input type="submit" name="SubmitCommand" value="SearchArtist"  class="cancel" />
        @if (Model.SearchResult != null)
        {
            <div> 
                <table><tr><th>Name</th><th></th></tr>
                @foreach (var item in Model.SearchResult)
                {
                    <tr><td>@item.Name</td>
                        <td><a href="@Url.Action("Create", "Song", new { modelData = Model })">Add</a></td>
                     </tr>
                }
                </table>

            </div>
        }
    </div>

     <div style=" border-top:1px solid #ccc; width: 400px; height:auto; margin-top:30px; margin-bottom:30px;"></div>

    <p>
        <input type="submit" name="SubmitCommand" value="AddNewSong" />
    </p>
}

1 Ответ

0 голосов
/ 03 декабря 2011

Я думаю, вы тоже смешиваете вещи в одной форме.

Решение 1)

Создание первого шага, где пользователь вставляет данные и создание песни.

Создание второго шага, когда пользователь добавляет исполнителей в песню..

Решение 2)

Предоставить кнопке отправки функцию сохранения данных.

Для поиска исполнителя используйте ajax-компонент, подобный этому:

http://harvesthq.github.com/chosen/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...