如何修改create方法?

时间:2015-03-11 00:20:46

标签: c# asp.net-mvc asp.net-mvc-4 model

我有这个型号:

public class UsuarioMusica
{
    public int UsuarioMusicaId { get; set; }
    public int UserId { get; set; }
    public int MusicId {get; set;}

}

我生成了一个控制器和视图,但我只会谈论创建方法。 我的问题是,我需要从已登录用户和“MusicId”中获取UserId以在桌面上建立关系,对吧?所以,我在音乐控制器中创建了一个搜索视图和搜索方法,列出了保存在音乐模型中的所有音乐,搜索视图:

@model IEnumerable<TestTcc2.Models.Musica>
@{
    ViewBag.Title = "Search";
    Layout = "~/Views/Shared/_LayoutOuvinte.cshtml";
}
<h2>Busca de Música</h2>
<table class="table table-hover table-bordered">
       <tr>
        <th>
            <span>Genero</span>
        </th>

        <th>
            <span>Nome</span>
        </th>
        <th>
            <span>Artista</span>
        </th>
        <th>
            <span>Preço</span>
        </th>
        <th></th>
    </tr>
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.genero.Nome)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Nome)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.NomeArtista)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Preco)
        </td>
        <td>
            @Html.ActionLink("Play", "", new { path = item.path }) |
        </td>
    </tr>
}
</table>

我的想法是,在此视图中,我将为每一行创建一个新链接,例如@Html.ActionLink("Add music to my collection", "Create", "UsuarioMusica" })将调用create方法,并将usuarioMusica模型添加到记录的userId用户和音乐来自桌上列出的音乐。

但我不知道如何在UsuarioMusica控制器上创建方法,实际上,这是我的创建方法:

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(UsuarioMusica usuariomusica)
        {
            if (ModelState.IsValid)
            {
                db.UsuarioMusicas.Add(usuariomusica);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(usuariomusica);
        }

这里的主要缺点是如何修改create方法以从用户在“将音乐添加到我的收藏”链接中创建的行中的音乐中获取userID,musicID,并保存在UsuarioMusica表格中。

1 个答案:

答案 0 :(得分:2)

@Html.ActionLink是重定向到GET方法。您需要为发布项ID的每一行包含<form>元素。但是,这意味着每次发布时都会重新创建视图,因此您将使用ajax大大提高性能。

@foreach (var item in Model) {
  <tr>
    <td>
      @Html.DisplayFor(m => item.genero.Nome)
    </td>
    ......
    <td>
      <button type="button" class="addmusic" data-id="@item.MusicaId">Add</button>
    </td>
}

请注意,项目ID已添加到按钮数据属性中,因此可以在脚本中检索

脚本

var url = '@Url.Action("Create", "YourControllerName")'; // adjust to suit
$('.addmusic').click(function() {
  var self = $(this);
  // Get the ID
  var id = self.data('id');
  // post the value
  $.post(url, { musicaID: id }, function(data) {
    if(data) {
      // remove the button so the item cannot be added more than once
      self.remove();
    } else {
      // Oops, something went wrong - display message?
    }
  });
});

注意:要从DOM中删除项目行(而不仅仅是按钮),请使用

if(data) {
  var row = self.closest('tr')
  row.remove();
}

和控制器

[HttpPost]
public JsonResult Create(int musicaID)
{
  var userID = // you should know this on the server
  // call a service that saves the userID and musicaID to the database
  var usuariomusica = new UsuarioMusica()
  {
    UserId = userID,
    MusicId = musicaID
  };
  db.UsuarioMusicas.Add(usuariomusica);
  db.SaveChanges();
  return Json(true);
}

注意:如果save方法失败,请使用return Json(null),以便脚本通知失败。另请注意[ValidateAntiForgeryToken]的缺席。如果你想要这个,那么令牌也需要在ajax请求中传递,如下所示

var token = $('input[name="__RequestVerificationToken"]').val();
$.post(url, { musicaID: id, __RequestVerificationToken: token }, function(data) {