在mvc中没有为此对象定义无参数构造函数

本文关键字:定义 对象 参数 构造函数 mvc | 更新日期: 2023-09-27 18:12:15

当我在View中使用SelectList时,我收到错误"没有为此对象定义无参数构造函数",我看到了许多解决方案,但找不到适合我的解决方案。这是视图代码:

@using (Html.BeginForm("Product", "Products", FormMethod.Post, new { @class = "form-horizontal" }))
{
   @Html.ValidationSummary()
   <div class="form-group">
       <label class="control-label col-md-3" for="SelectProduct">Select Product</label>
       <div class="col-md-4">
           @Html.DropDownListFor(p => p.SelectProduct, new SelectList(new[] 
           {
             new { Value = "New", Text = "New Entry" },
             new { Value = "Existing", Text = "Existing Entry" },
           }, "Value", "Text"), 
           new { @class = "form-control" })
       </div>
   </div> 
   <div class="form-group">
       <label class="control-label col-md-3" for="productName">Product Name</label>
       <div class="col-md-8">
          @Html.TextBoxFor(u => u.ProductName, new { @class = "form-control", @id = "productName" })
       </div>
   </div>   
}

控制器:

[HttpPost]
public ActionResult Product(ProductDto model)
{
    //code here
}

型号:

public class ProductDto
{
    public ProductDto()
    {
    }
    /// <summary>
    /// Gets or sets whether its New or existing product
    /// </summary>
    public SelectList SelectProduct { get; set; }

    /// <summary>
    /// Gets or sets product name.
    /// </summary>
    public string ProductName { get; set; }
}

堆栈跟踪:

[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, StackCrawlMark& stackMark) +119
      System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
     System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
     System.Activator.CreateInstance(Type type) +11
     System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +183
    System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext controllerContext, ModelBindingContext bindingContext, ValueProviderResult valueProviderResult) +329
     System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +368
     System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) +17
      System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +384
      System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +88
                  System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +53
         System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +1314
        System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +416
      System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +317
         System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +117
       System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +446
       System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
       System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302
    System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30
      System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
  System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +381
       System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130
      System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317
        System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +17
       System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +71
   System.Web.Mvc.Async.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130

感谢

在mvc中没有为此对象定义无参数构造函数

DropDownListFor用于为模型中的属性设置值-您的模型包含一个类型为SelectListSelectProduct属性-我猜它应该是string类型,因为这是您在视图中构建的SelectListValue属性的类型。

public class ProductDto
{
    public ProductDto()
    {
    }
    /// <summary>
    /// Gets or sets whether its New or existing product
    /// </summary>
    public string SelectProduct { get; set; }

    /// <summary>
    /// Gets or sets product name.
    /// </summary>
    public string ProductName { get; set; }
  }

请注意,更纯粹的方法是在控制器或ViewModel中构建SelectList,而不是在视图中。这样,就可以将构建可能值的逻辑从视图本身中分离出来。

@Html.DropDownListFor(p => p.SelectProduct, new SelectList(new[] 

您应该更改此代码。

@Html.DropDownListFor(p => p.SelectProductID, new SelectList(new[] 

我使用SelectProductID是因为当您想要使用时。它将填充模型。

所以你只能选择一个项目你的下拉列表。

我希望这对你有用。

谢谢。

如果您在ProductDto类中使用的SelectListSystem.Web.Mvc.SelectList,那么这就是问题的原因。System.Web.Mvc.SelectList没有无参数构造函数。

此代码将帮助您使用此方法

Htmlcs

@model OspWebsite.Models.bcEvent             
@using (Html.BeginForm())  
@Html.AntiForgeryToken()
  @Html.ValidationSummary(true)
<div class="col-4 ">
    @Html.LabelFor(model => model.eventCountry, new { @class = "col-sm-6  control-label" })   //For Label
    @Html.DropDownList("FeedBack", ViewData["dropdownCountry"] as List<SelectListItem>)     //For DropDown 
 </div>
}

MngClass。。。

public class MngEvent
{
public DataTable ShowEvent()
    {
        try
        {
          SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ospDB"].ConnectionString);
            SqlCommand cmd = new SqlCommand("usp_SelectAllConfrence", con);
            SqlDataAdapter sda = new SqlDataAdapter();
            DataTable dt = new DataTable();
            cmd.CommandType = CommandType.StoredProcedure;
            if (con.State.Equals(ConnectionState.Closed))
                con.Open();
            sda.SelectCommand = cmd;
            sda.Fill(dt);
            con.Close();
            return dt;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
  }

控制器。。。

   public class AdminEventsController : Controller
   {
    [HttpGet]
    public ActionResult addEvent()
    {   
        ////ComboBox Country
        List<SelectListItem> lst = new List<SelectListItem>();
        MngEvent events = new MngEvent();
        DataTable dt1 = events.ShowEvent();
        for (int i = 0; i <= dt1.Rows.Count; i++)
        {
            lst.Add(new SelectListItem { Text = dt1.Rows[i]["ConfrenceCountry"].ToString(), Value = dt1.Rows[i]["ConfrenceID"].ToString() });
        }
        ViewData["dropdownCountry"] = lst;
        return View();
    }
 }

如果有任何问题反馈。感谢