2013-01-17 13 views
9

में मुझे यकीन है कि यह काफी सरल है लेकिन मैं यहां थोड़ा फंस गया हूं। मेरे ऐप के लिए परिभाषित रूटिंग सिर्फ डिफ़ॉल्ट है। मेरे पास निम्नलिखित नियंत्रक परिभाषित है।इस ऑब्जेक्ट के लिए कोई पैरामीटर रहित कन्स्ट्रक्टर परिभाषित नहीं किया गया है। एएसपी.नेट एमवीसी नियंत्रक

namespace Baynes.Wedding.Web.Controllers 
{ 
    public class AdminController : Controller 
    { 
     private readonly IAuthProvider _authProvider; 
     private readonly IDocumentRepository _documentRepository; 

     public AdminController(IAuthProvider authProvider, IDocumentRepository documentRepository) 
     { 
      _authProvider = authProvider; 
      _documentRepository = documentRepository; 
     } 

     public ViewResult EditDocument(int id) 
     { 
      var document = _documentRepository.Select(id); 

      return View(new DocumentEditViewModel(document)); 
     } 

     [HttpPost] 
     public ActionResult EditDocument(DocumentEditViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       _documentRepository.Update(model.ToDocument()); 
       return RedirectToAction("ListDocuments"); 
      } 

      return View(); 
     } 
    } 
} 

जब मैं /Admin/EditDocument/1/ पर जाएं, फिर पहली कार्रवाई कार्यान्वित वास्तव में अपेक्षा के अनुरूप, निम्न दृश्य प्रतिपादन: -:

No parameterless constructor defined for this object. अन्य प्रश्न -

<h2>@ViewBag.Title</h2> 
@using (Html.BeginForm("EditDocument", "Admin", FormMethod.Post)) { 
    @Html.ValidationSummary(true) 
    @Html.HiddenFor(m => Model.Id) 
    <div> 
     @Html.LabelFor(m => Model.Title) 
    </div> 
    <div> 
     @Html.TextBoxFor(m => Model.Title) 
    </div> 
    <div> 
     @Html.LabelFor(m => Model.Body) 
    </div> 
    <div> 
     @Html.TextAreaFor(m => Model.Body) 
    </div> 
    <div> 
     @Html.LabelFor(m => Model.Url) 
    </div> 
    <div> 
     @Html.TextBoxFor(m => Model.Url) 
    </div> 

    <input type="submit" value="Edit" /> 
} 

इस प्रस्तुत करने पर मैं कोई त्रुटि मिलती है प्रतीत होता है कि संबंधित प्रश्न MVC: No parameterless constructor defined for this object सुझाव देते हैं कि आईओसी कंटेनर के साथ यह ठीक से स्थापित नहीं किया जा रहा है, लेकिन निश्चित रूप से तथ्य यह है कि पहली कार्रवाई किसी समस्या के बिना निष्पादित होती है जिसका मतलब है कि पीआर नहीं है यहाँ प्रतीक है?

किसी भी मदद की सराहना की जाएगी।

सम्मान।

साइमन

+2

क्या आप कृपया DocumentViewModel –

उत्तर

14

वर्ग DocumentEditViewModel डिफ़ॉल्ट निर्माता को जोड़ने के

public DocumentEditViewModel(){} 
+0

परफेक्ट धन्यवाद के लिए कोड प्रदान कर सकते हैं। जब आप जानते हैं कि यह आसान है;) – baynezy

+1

यह आवश्यक क्यों है? मेरे दिमाग में, नियंत्रकों के पास अधिकांश वर्गों की तरह सिस्टम द्वारा बनाए गए डिफ़ॉल्ट कन्स्ट्रक्टर होना चाहिए। – levininja

+0

@levininja JTMon ने आपके प्रश्न पर उत्तर दिया – Mediator

1

करता DocumentEditViewModel एक parameterless निर्माता है? मेरा मानना ​​है कि आपके पोस्ट व्यू पर मॉडलबाइंडिंग के लिए इसकी आवश्यकता है।

5

एमवीसी ढांचा दस्तावेज़व्यू मॉडेल क्लास का एक उदाहरण बनाने की कोशिश कर रहा है लेकिन यह सार्वजनिक रूप से सुलभ डिफ़ॉल्ट कन्स्ट्रक्टर नहीं ढूंढ सकता है (जो कोई तर्क नहीं लेता है)। आप या तो ऐसे डिफॉल्ट कन्स्ट्रक्टर को परिभाषित कर सकते हैं जैसे कि @simplyDenis ने सुझाया है या एक cusotm मॉडलबिंडर को परिभाषित किया है जो आपके कस्टम कन्स्ट्रक्टर का उपयोग करके इंस्टेंस बना सकता है।

1

अधिकतर आपके पास निर्भरता इंजेक्शन तंत्र है। लेकिन एमवीसी को कंटेनर पंजीकृत करने के लिए "विशेष" तरीका चाहिए। इस लिंक को देखें Adding Unity to Your Web Applications, patterns and practices

0

मुझे थोड़ा अलग समस्या थी। मेरे मॉडल वर्गों में से एक abstract था।

0

यदि दस्तावेज़EditViewModel कन्स्ट्रक्टर का पहुंच स्तर सुरक्षित है तो आपको भी वही त्रुटि मिल जाएगी।