繁体   English   中英

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

[英]No parameterless constructor defined for this object in mvc

当我在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

谢谢

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 这样,您就可以从视图本身中分离构建可能值的逻辑。

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

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

你应该改变这个代码。

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

我使用SelectProductID是因为你想使用它。 它将填充模型。

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

我希望这对你有用。

谢谢。

本准则将帮助您。 使用此方法

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();
    }
 }

如有任何问题反馈。 谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM