Me gustaría saber cómo puedo usar mi ViewModel en Create Action? Probé varios ejemplos que encontré aquí en el foro, pero ninguno resolvió mi problema. He estado trabajando en mi cerebro por unos días, pero no puedo descifrar qué está mal.MVC ViewModel Error - No se ha definido ningún constructor sin parámetros para este objeto
Cada vez que hago clic en el botón Crear, aparece el siguiente error: No se ha definido ningún constructor sin parámetros para este objeto.
@model MvcMusicStore.ViewModels.AlbumViewModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Album</legend>
<div class="editor-label">
@Html.LabelFor(model => model.AlbumItem.GenreId, "Genre")
</div>
<div class="editor-field">
@Html.DropDownList("Genres", String.Empty)
@Html.ValidationMessageFor(model => model.AlbumItem.GenreId)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.AlbumItem.ArtistId, "Artist")
</div>
<div class="editor-field">
@Html.DropDownList("Artists", String.Empty)
@Html.ValidationMessageFor(model => model.AlbumItem.ArtistId)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.AlbumItem.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.AlbumItem.Title)
@Html.ValidationMessageFor(model => model.AlbumItem.Title)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.AlbumItem.Price)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.AlbumItem.Price)
@Html.ValidationMessageFor(model => model.AlbumItem.Price)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.AlbumItem.AlbumArtUrl)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.AlbumItem.AlbumArtUrl)
@Html.ValidationMessageFor(model => model.AlbumItem.AlbumArtUrl)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Create.cshtml
public class StoreManagerController : Controller
{
private MusicStoreDB db = new MusicStoreDB();
//
// GET: /StoreManager/Create
public ActionResult Create()
{
var viewModel = new AlbumViewModel()
{
Genres = new SelectList(db.Genres, "GenreId", "Name"),
Artists = new SelectList(db.Artists, "ArtistId", "Name")
};
return View(viewModel);
}
//
// POST: /StoreManager/Create
[HttpPost]
public ActionResult Create(AlbumViewModel vm)
{
if (ModelState.IsValid)
{
db.Albums.Add(vm.AlbumItem);
db.SaveChanges();
return RedirectToAction("Index");
}
vm.Genres = new SelectList(db.Genres, "GenreId", "Name", vm.AlbumItem.GenreId);
vm.Artists = new SelectList(db.Artists, "ArtistId", "Name", vm.AlbumItem.ArtistId);
return View(vm);
}
}
StoreManager.cs - Fragmento
public class AlbumViewModel
{
public AlbumViewModel()
{
// nothing
}
public Album AlbumItem { get; set; }
public SelectList Genres { get; set; }
public SelectList Artists { get; set; }
}
public class Album
{
public Album()
{
// nothing
}
public virtual int AlbumId { get; set; }
public virtual int GenreId { get; set; }
public virtual int ArtistId { get; set; }
public virtual string Title { get; set; }
public virtual decimal Price { get; set; }
public virtual string AlbumArtUrl { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
}
public class Artist
{
public Artist()
{
// nothing
}
public virtual int ArtistId { get; set; }
public virtual string Name { get; set; }
}
public class Genre
{
public Genre()
{
// nothing
}
public virtual int GenreId { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual List<Album> Albums { get; set; }
}
¿Qué es 'Género'? – SLaks
Se agregó 'Género' y' Artista' en el código anterior. – fvss
Lo único que parece no tener un constructor sin parámetros es SelectList (http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.108).aspx). ¿Qué pasa si comenta eso? –