Я новичок в 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>
}