在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
感谢
DropDownListFor
用于为模型中的属性设置值-您的模型包含一个类型为SelectList
的SelectProduct
属性-我猜它应该是string
类型,因为这是您在视图中构建的SelectList
的Value
属性的类型。
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
类中使用的SelectList
是System.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();
}
}
如果有任何问题反馈。感谢