2011-09-19 2 views
0

MVC 2.0 응용 프로그램 부분보기에 문제가있어 갑자기 액세스하고 물건을 실제로 ViewData에 넣으면 무언가가없는 생성자 오류가 발생합니다. 내가 할 수있는만큼 코드를 따라 갔고, 나는 어디를 가는지 알지 못한다. 여기 내 코드입니다 :MVC asp.net PartialView가 매개 변수없는 생성자 오류를 발생시키지 않았습니까?

컨트롤러 :

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.Mvc; 
    using System.ComponentModel; 
    using CINet.Areas.CatalystSearch.Models.Interfaces; 
    using CINet.Areas.CatalystSearch.Models.Repository; 
    using CINet.Areas.CatalystSearch.Models.Entities; 

    namespace CINet.Areas.CatalystSearch.Controllers 
    { 
     public class CatalystSearchController : Controller 
     { 
      // private SqlCatalystRepository _catalystItemRepository; 
      private ICatalystRepository _catalystInterface; 
      public int PageSize = 10; // Regulates size of page 

     #region CONSTRUCTOR 

     /// <summary> 
     /// Constructor which sets the passed repository to the local current 
     /// repository 
     /// </summary> 
     /// <param name="catalystRepository">Interface repository for controller</param> 
     public CatalystSearchController() 
     { 

     } 

     #endregion 

     #region DEFAULT VIEW 


     public ViewResult List([DefaultValue("")] string manufactureName, [DefaultValue("")] string manufacturePartNumber, [DefaultValue("")] string description, [DefaultValue(1)] int page) 
     { 

      IQueryable<CatalystItem> query = null; 
      CatalystFilter userFilter = new CatalystFilter(); 
      int totalItems = 0; 

      // Be sure that the manufacture drop down has been selected 
      if (manufactureName != "") 
      { 
       // Set up CatalystFilter 
       userFilter.Manufacture = manufactureName; 
       userFilter.DescriptionFilter = description; 
       userFilter.ManufacturePartNumberFilter = manufacturePartNumber; 

       // connection string for SQL 
       string connString = "Data Source=se-cinet-dev;Initial Catalog=cinet;User ID=sa;Password=Carouse1"; 


       // Get interface 
       _catalystInterface = new CatalystRepository(connString); 


       // Collects data from SQL repository and updates private local copy 
       // _catalystItemRepository = new SqlCatalystRepository(connString); 

       // Fills with list of Catalystitems based on filter. 
       query = _catalystInterface.GetCatalystItems(userFilter, page, PageSize); 
       // query = _catalystItemRepository.GetItems(userFilter, page, PageSize); 

       // Returns int of total items in list 
       totalItems = _catalystInterface.GetTotalOfItems(userFilter); 
       // totalItems = _catalystItemRepository.GetTotalOfItems(userFilter); 

       // Set up view model for passing to View 
       var viewModel = new CatalystModel 
       { 

        catalystItems = query.ToList(), 
        catalystFilter = userFilter, 

        /* Pass Paging properties to model*/ 
        PagingInfo = new PagingInfo 
        { 
         CurrentPage = page, 
         ItemsPerPage = PageSize, 
         TotalItems = totalItems 

        }, 
        ManufactureName = manufactureName 

       }; 

       // View Data to be passed to SearchView 
       ViewData["catalystItems"] = viewModel; 


       return View(viewModel); 
      } 

      else 
      { 
       var viewModel = new CatalystModel(); 
       return View(viewModel); 
      } 
     } 

     #endregion 

     #region SEARCH VIEW 

     /// <summary> 
     /// Partial View used to display results from controller 
     /// </summary> 
     /// <param name="model"> model passed via ViewData from List View</param> 
     /// <returns></returns> 
     [ChildActionOnly] 
     public ViewResult SearchView(CatalystModel model) 
     { 
      return View(model); 
     } 

     #endregion 

    } 
} 

listView: 

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<CINet.Areas.CatalystSearch.Models.Entities.CatalystModel>" %> 
<%@ Import Namespace="CINet.Areas.CatalystSearch.HtmlHelpers" %> 
<%@ Import Namespace="CINet.Areas.CatalystSearch.Models" %> 
<%@ Import Namespace="CINet.Areas.CatalystSearch.Models.Interfaces" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 

    <div> 
     <center> 
      <strong> 
       <%= Html.ValidationSummary("Please fill out required Fields") %></strong> 

       <h1>Catalyst Search Provider</h1> 
      <hr /> 
      <%-- "Search","Catalyst" --%> 
      <% 
       using (Html.BeginForm()) 
       { %> 
      <table border="1"> 

       <tr> 
       <td>Enter Description (optional):</td> 
       <td> 
       <%: Html.TextBoxFor(x=>x.Description) %> 
       </td> 
       </tr> 

       <tr> 
       <td>Enter Part Number (optional):</td> 
       <td> 
       <%: Html.TextBoxFor(x=>x.ManufacturePartNumber) %> 
       </td> 
       </tr> 

       <tr> 
        <td>Choose Manufacture: 
        </td> 
        <td> 
         <%: Html.DropDownListFor(x => x.ManufactureName, Model.GetAllManufactures()) %> 
         <%-- <%: Html.DropDownList("ManufactureName", Model.GetAllManufactures(),"Choose Item")%> --%> 
        </td> 
       </tr> 
       <tr> 
        <td> 
         &nbsp 
        </td> 
        <td> 
         <input type="submit" name="Search" value="Search" /> 
        </td> 
       </tr> 
      </table> 
      <% } Html.EndForm(); %> 
      <!-- RENDERS PARTIAL VIEW TO DISPLAY GRID WITH SEARCH RESULTS --> 
      <% Html.RenderAction("SearchView", ViewData["catalystItems"]); %> 
      <br /> 
     </center> 
    </div> 
    <div class="pager"> 

     <% if (Model.PagingInfo != null) 
      { %> 
     <%: Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new { page = x, manufactureName = Model.catalystFilter.Manufacture, description = Model.catalystFilter.DescriptionFilter, manufacturePartNumber = Model.catalystFilter.ManufacturePartNumberFilter }))%> 
     <% } %> 
    </div> 

</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 


SearchView: 

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CINet.Areas.CatalystSearch.Models.Entities.CatalystModel>" %> 
<%@ Import Namespace="CINet.Areas.CatalystSearch.HtmlHelpers" %> 
<%@ Import Namespace="CINet.Areas.CatalystSearch.Models" %> 

<div> 
    <% if (Model.catalystItems != null) 
     { %> 
     <table class="CatalystTableSpacer"> 
      <tr> 
       <td> 
        Contract Price 
       </td> 
       <td> 
        Description 
       </td> 
       <td> 
        Manufacture Name 
       </td> 
       <td> 
        Manufacture Part Number 
       </td> 
       <td> 
        MSRP Price 
       </td> 
       <td> 
        Quantity Available 
       </td> 

      </tr> 
      <% foreach (var items in Model.catalystItems) 
       {%> 
      <tr> 
       <td> 
        <%: items.ContractPrice%> 
       </td> 
       <td> 
        <%: items.Description%> 
       </td> 
       <td> 
        <%: items.ManufactureName%> 
       </td> 
       <td> 
        <%: items.ManufacturePartNumber%> 
       </td> 
       <td> 
        <%: items.MSRPrice%> 
       </td> 
       <td> 
        <%: items.QuantityAvailable%> 
       </td> 

      </tr> 
      <% } 
     } 

       %> 
      </table> 

      </div> 

CatalystModel

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using CINet.Areas.CatalystSearch.Models.Entities; 
using System.ComponentModel.DataAnnotations; 
using CINet.Areas.CatalystSearch.Models.Repository; 
using CINet.Areas.CatalystSearch.Models.Interfaces; 

namespace CINet.Areas.CatalystSearch.Models.Entities 
{ 
    public class CatalystModel 
    { 

      #region PRIVATE FIELDS 

     private string _connectionString = "Data Source=se-cinet-dev;Initial Catalog=cinet;User ID=sa;Password=Carouse1"; // connection string for SQL 
     private ICatalystRepository _repository = null; 

     #endregion 
    #region PUBLIC PROPERTIES 

    public IList<CatalystItem> catalystItems { get; set; } 
    public PagingInfo PagingInfo { get; set; } 
    public CatalystFilter catalystFilter { get; set; } 
    public SelectList Manufactures { get; set; } 
    public SelectList Categories { get; set; } 

    [Required] 
    public string ManufactureName { get; set; } 

    public string Description { get; set; } 

    public string ManufacturePartNumber { get; set; } 

    #endregion 


    #region CONSTRUCTOR 

    /// <summary> 
    /// Constructor instantiates SQL DB Connection 
    /// </summary> 
    public CatalystModel() 
    { 
     _repository = new CatalystRepository(_connectionString); 
    // Manufactures = GetAllManufactures(); 
    } 



    #endregion 

    #region PUBLIC GET LISTS 

    /// <summary> 
    /// Returns ALL Manufactures in Database 
    /// </summary> 
    /// <returns></returns> 
    public SelectList GetAllManufactures() 
    { 
     SelectList manufactureNameSelectList; 
     List<Manufacture> manufactureTempList = new List<Manufacture>(); 

     // Get List from DB 
     manufactureTempList = _repository.GetManufactureList(); 

     // PUSH LIST INTO SELECT LIST 
     manufactureNameSelectList = new SelectList(manufactureTempList, "ManufactureName", "ManufactureName"); 

     return manufactureNameSelectList; 
    } 



    #endregion 

} 

}

오류가 SearchView 호출의 ListView에서 발생합니다

<퍼센트의 Html.RenderAction을 ("SearchView", ViewData [ "catalystItems"]); %>

어떤 도움 ??

실제 오류 :

귀하의 문제는 기본 모델 바인더는 여기를 인스턴스화 할 수 있도록 CatalystModel 클래스는 기본 생성자가없는 것입니다
Server Error in '/' Application. 
-------------------------------------------------------------------------------- 

No parameterless constructor defined for this object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object. 

Source Error: 


Line 53:    <!-- RENDERS PARTIAL VIEW TO DISPLAY GRID WITH SEARCH RESULTS --> 
Line 54:   <%-- <% Html.RenderPartial("SearchView", ViewData["catalystItems"]); %> 
Line 55:   --%> <% Html.RenderAction("SearchView", ViewData["catalystItems"]); %> 
Line 56:    
Line 57:    <br /> 


Source File: c:\Users\gcoleman\Documents\Source Code\Sandbox\Jonathan Henk\MVC\CINet\CINet\Areas\CatalystSearch\Views\CatalystSearch\List.aspx Line: 55 

Stack Trace: 


[MissingMethodException: No parameterless constructor defined for this object.] 
    System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 
    System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98 
    System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 
    System.Activator.CreateInstance(Type type, Boolean nonPublic) +69 
    System.Activator.CreateInstance(Type type) +6 
    System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +403 
    System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext controllerContext, ModelBindingContext bindingContext, ValueProviderResult valueProviderResult) +544 
    System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +479 
    System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) +45 
    System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +658 
    System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +147 
    System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +98 
    System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +2504 
    System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +548 
    System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +475 
    System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +181 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +830 
    System.Web.Mvc.Controller.ExecuteCore() +136 
    System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +111 
    System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +39 
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +65 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +44 
    System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +42 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +141 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +54 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +52 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38 
    System.Web.Mvc.<>c__DisplayClassa.<EndProcessRequest>b__9() +44 
    System.Web.Mvc.<>c__DisplayClass4.<Wrap>b__3() +34 
    System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Func`1 func) +76 
    System.Web.Mvc.ServerExecuteHttpHandlerWrapper.Wrap(Action action) +113 
    System.Web.Mvc.ServerExecuteHttpHandlerAsyncWrapper.EndProcessRequest(IAsyncResult result) +124 
    System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +1072 

[HttpException (0x80004005): Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.] 
    System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) +3058371 
    System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage) +77 
    System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) +28 
    System.Web.HttpServerUtilityWrapper.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm) +22 
    System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter) +766 
    System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues) +98 
    System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper htmlHelper, String actionName, Object routeValues) +65 
    ASP.areas_catalystsearch_views_catalystsearch_list_aspx.__RenderContent1(HtmlTextWriter __w, Control parameterContainer) in c:\Users\gcoleman\Documents\Source Code\Sandbox\Jonathan Henk\MVC\CINet\CINet\Areas\CatalystSearch\Views\CatalystSearch\List.aspx:55 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109 
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
    System.Web.UI.Control.Render(HtmlTextWriter writer) +10 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
    ASP.views_shared_site_master.__Renderform1(HtmlTextWriter __w, Control parameterContainer) in c:\Users\gcoleman\Documents\Source Code\Sandbox\Jonathan Henk\MVC\CINet\CINet\Views\Shared\Site.Master:26 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109 
    System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer) +8820669 
    System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer) +31 
    System.Web.UI.HtmlControls.HtmlForm.Render(HtmlTextWriter output) +53 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer) +40 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
    System.Web.UI.Control.Render(HtmlTextWriter writer) +10 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
    System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208 
    System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8 
    System.Web.UI.Page.Render(HtmlTextWriter writer) +29 
    System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +56 
    System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100 
    System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060 




-------------------------------------------------------------------------------- 
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.237 

답변

3

:

[ChildActionOnly] 
public ViewResult SearchView(CatalystModel model) 
{ 
    return View(model); 
} 

이 존재는 가지며, 다음과 같이 호출하는 하위 컨트롤러 작업 :

<% Html.RenderAction("SearchView", ViewData["catalystItems"]); %> 

은 전혀 쓸모가 없어서 아무 가치도 없습니다.

왜 직접 부분 렌더링하지 않습니다

<% Html.RenderPartial("SearchView", ViewData["catalystItems"]); %> 

또한 더 나은 RenderAction 및 RenderPartial 사이의 차이점을 이해하기 위해 Haacked blog post을 읽어야합니다.

또는 실제 매개 변수로 기본 생성자가없는 일부 모델을 사용하는 컨트롤러 작업이있는 경우 (이 경우 다소 이상한 이유로)이 유형에 대한 사용자 지정 모델 바인더를 작성하고 사용자 지정 생성자 중 어느 것을 지정해야합니까? 그것을 인스턴스화하는 데 사용되며 어떤 값이 물론 전달되어야합니다.

+0

감사를 너무 빨리 여기에 다시 나에게 얻기를 위해. 나는 RenderPartial이 덜 사용되었다는 것을 잠시 전에 읽었지 만, 더 좋은 uderstanding을 얻기 위해 그 기사를 읽을 것입니다. 생성자에 관해서는 모델에 대해 요구하는 것이 아닙니다. ///

/// 생성자 SQL DB 연결을 /// 공공 CatalystModel() { _repository = 새로운 CatalystRepository (_connectionString를) 인스턴스화; // Manufactures = GetAllManufactures(); } – gcoleman0828

+0

@ user479323, 나는 매개 변수없는 생성자가없는'CatalystModel' 클래스에 대해 이야기했습니다. 나는 정말로 당신이 당신의 코멘트에 나를 보여주고 있는지 모른다. –

+0

맞긴하지만 내가 말하는 것은 매개 변수가없는 생성자가 있다는 것입니다. 위, CatalystModel 클래스를 포함하도록 내 게시물을 편집했습니다. ??#region CONSTRUCTOR ///

/// 생성자는 SQL DB 연결을 인스턴스화합니다. /// public CatalystModel() {_repository = new CatalystRepository (_connectionString); // Manufactures = GetAllManufactures(); } – gcoleman0828

0

이 시도 :

<% Html.RenderAction("SearchView", new { model = ViewData["catalystItems"] }); %> 
관련 문제