我所擁有的是一個包含多個輸入的表單,我想用它來查詢數據庫中的某些結果。表單有一些默認值,它都可以工作,但我有問題提交給自己。在ASP.NET MVC中使用SelectList提交模型
返回的錯誤是「No paramaterless constructor defined for this object」,它是由SelectList對象引起的。
我試過this solution,並用getter和setter將psUserType私有,並將它初始化爲空列表,但是然後我的dropDown菜單在開始時沒有值。不知道爲什麼GetUserTypes沒有填充它們。
我在這裏做錯了什麼?一個人如何同時具有預先選定的值,並將同一模型與用戶選擇的值一起發送,同時還在同一頁面上顯示結果?
對於所有3個動作使用相同的模型是否有意義:1.使用默認值顯示錶單和輸入2.在提交期間張貼選定值3.返回結果和選定值?我讀過this solution也不知道如何在這裏使用2或3個獨立的模型。
任何幫助表示讚賞。提前致謝。
型號
public class SearchDownloadsModel
{
public SelectList psUserType { get; private set; } //causes problem on submit
public string psText { get; set; }
public MultiSelectList psColumns { get; private set; }
public IEnumerable<ResultsRowModel> psResults { get; set; }
public SearchDownloadsModel()
{
this.psUserType = GetUserTypes();
this.psColumns = GetColumns();
this.psResults = new List<ResultsRowModel>(); //empty by default
}
public SelectList GetUserTypes()
{
List<SelectListItem> items = new List<SelectListItem>()
{
new SelectListItem { Value="user", Text="Single User" },
new SelectListItem { Value="group", Text="User group" },
...
};
return new SelectList(items, "Value", "Text");
}
public MultiSelectList GetColumns()
{
List<SelectListItem> items = new List<SelectListItem>()
{
new SelectListItem { Value = "user", Text="Username" },
new SelectListItem { Value = "file", Text="Filename" },
new SelectListItem { Value = "titl", Text="Title" },
new SelectListItem { Value = "auth", Text="Author" },
...
};
return new MultiSelectList(items, "Value", "Text");
}
}
public class ResultsRowModel
{
public int ID { get; set; }
public string EventTime { get; set; }
public string FileName { get; set; }
public string FilePath { get; set; }
public string UserName { get; set; }
...
}
查看
@model Proj.Models.SearchDownloadsModel
@using (Html.BeginForm("Downloads", "Home", FormMethod.Post))
{
@Html.DropDownListFor(x => x.psUserType, Model.psUserType)
@Html.TextBoxFor(x => x.psText)
@Html.ListBoxFor(x => x.psColumnsSelected, Model.psColumns, new { multiple = "multiple" })
<button type="submit" class="btn btn-primary">Search</button>
}
@if (Model.psResults != null && Model.psResults.Any())
{
<table>
<tr>
<th>User</th>
<th>File</th>
</tr>
@foreach (var row in Model.psResults)
{
<tr>
<td>@row.UserName</td>
<td>@row.FileName</td>
</tr>
}
</table>
}
控制器
[HttpGet]
public ActionResult Downloads()
{
SearchDownloadsModel model = new SearchDownloadsModel();
model.psColumnsSelected = new List<string>() { "user", "file" }; //preselected values
return View(model);
}
[HttpPost]
public ActionResult Downloads(SearchDownloadsModel model)
{
model.psResults = queryDatabase(model);
return View(model);
}
private List<ResultsRowModel> queryDatabase(SearchDownloadsModel model)
{
//...
}
編輯:添加SearchDownloadsModel
你能不能也請添加類的定義「ResultsRow模型「 –
我同意@KD - 你的一個類有一個構造函數,它接受參數(例如, '公共MyClass(字符串1,字符串2)'),但沒有構造函數沒有(例如'公共MyClass()')並導致此錯誤。看看你的類,你應該能夠弄清楚這一個自己:)信息在這裏:http://stackoverflow.com/questions/1355464/asp-net-mvc-no-parameterless-constructor-defined-for -this-object –
@KD ResultsRowModel幾乎就是一個類,它具有存儲像'public string NameColumn {get; set;}'這樣的列的屬性,沒有別的。 – yosh