2012-10-03 14 views
8

मुझे पता है कि कैसे मैं पर बनाएं कार्रवाई मेरी ViewModel उपयोग कर सकते हैं के लिए परिभाषित किया? मैंने मंच में यहां मिले कई उदाहरणों की कोशिश की, लेकिन मेरी समस्या हल नहीं हुई। मैं कुछ दिनों के लिए अपने मस्तिष्क को रैक कर रहा हूं, लेकिन यह पता नहीं लगा सकता कि क्या गलत है।MVC ViewModel त्रुटि - कोई parameterless निर्माता इस वस्तु

जब भी मैं बनाएं बटन मैं निम्नलिखित त्रुटि मिलती है पर क्लिक करें: कोई parameterless निर्माता इस वस्तु के लिए परिभाषित किया।

@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 - स्निपेट

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; } 
    } 
+1

'क्या है Genre' काम करता है? – SLaks

+0

उपरोक्त कोड पर 'शैली' और 'कलाकार' जोड़ा गया। – fvss

+0

एकमात्र चीज जो पैरामीटर रहित कन्स्ट्रक्टर नहीं है, वह सिलेक्टलिस्ट (http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.108).aspx) है। क्या होगा यदि आप उन पर टिप्पणी करते हैं? –

उत्तर

24

अगर मैं हर बार जब मैं इस समस्या को देखा है के लिए एक निकल पड़ा। यह आमतौर पर अपने मॉडल गुण के नामकरण और आप उन्हें कैसे एक DropDownList में उपयोग करने के लिए संबंधित है। समय यह क्योंकि लोगों Html.DropDownList() उपयोग कर रहे हैं और उनके SelectList के रूप में यह एक ही नामकरण है की 99.999%। यह एक कारण है कि आपको दृढ़ता से टाइप किए गए DropDownListFor का उपयोग करना चाहिए।

@Html.DropDownList("Genres", String.Empty) 
@Html.DropDownList("Artists", String.Empty) 

देखें, एक ही नाम:

इस मामले में, आपकी समस्या यह है कि आप SelectListGenres और Artists नामित रों है, तो आपके विचार में आप है।

आपको क्या करना चाहिए SelectList को GenreList और ArtistList नामित करने के लिए अपना मॉडल बदलना चाहिए। फिर, दृढ़ता से टाइप किए गए मॉडल का उपयोग करने के लिए अपना दृश्य बदलें।

@Html.DropDownListFor(m => m.AlbumItem.GenreID, Model.GenreList) 
@Html.DropDownListFor(m => m.AlbumItem.ArtistID, Model.ArtistList) 

ऐसा होने का कारण यह है कि आप नियंत्रक को जेनर्स नामक मान पोस्ट कर रहे हैं। डिफॉल्ट मॉडल बाइंडर जेनर्स नामक कुछ ढूंढने के लिए मॉडल को दृढ़ता से देखता है और इसे तुरंत चालू करता है। लेकिन, बल्कि एक आईडी या स्ट्रिंग से, यह एक selectList नामित शैलियां पाता है, और जब यह यह दृष्टांत की कोशिश करता है, यह पाता है कोई डिफ़ॉल्ट निर्माता नहीं है।

इस प्रकार

अपने त्रुटि। तो इस बात के बारे में पूछने वाले प्रश्नों से भरा है।

+0

पर त्रुटि डाली गई लाइन मिल जाएगी! धन्यवाद! – fvss

+0

वही यहाँ। आपने मेरे कई घंटे बचाए –

0

Erik Funkenbusch's answer की ही तरह मैं अपनी फार्म के लिए एक DropDownList जोड़ा था, लेकिन मेरे मामले में यह नहीं था (और जाने के इरादे से नहीं किया गया था) के रूप में यह <form></form> टैग के बाहर था फॉर्म के द्वारा जमा:

@Html.DropDownList("myField", Model.MyField) 

मॉडल के रूप में केवल प्रदर्शन के लिए फ़ील्ड था, इसने No parameterless constructor defined for this object त्रुटि भी उत्पन्न की क्योंकि फ़ील्ड बिल्कुल सबमिट नहीं किया गया था।

इस मामले में मैं एक बंधन को बाहर जोड़कर तय:

public ActionResult Foo(int id, int? page, [Bind(Exclude = "MyField")]MyModel model) 
0

मेरे लिए समस्या BeginForm() विधि अपने आप में किया गया था। यह इस तरह से देखा:

@using (Html.BeginForm("MyAccount", "MyController", Model)) 

प्रतिलिपि बनाई गई और एक अन्य परियोजना के प्रवेश पृष्ठ है, जो एक लटकती नहीं है से चिपकाया।

वैसे भी, पैरामीटर सूची से मॉडल को हटा दें और यह सब ठीक :)

संबंधित मुद्दे