mô hình của tôi là như sau:On Post, một danh sách thả xuống SelectList.SelectedValue là null
public class testCreateModel
{
public string s1 { get; set; }
public SelectList DL { get; set; }
public testCreateModel()
{
Dictionary<string, string> items = new Dictionary<string, string>();
items.Add("1", "Item 1");
items.Add("2", "Item 2");
DL = new SelectList(items, "Key", "Value");
}
}
hành động bắt đầu của tôi là:
public ActionResult testCreate()
{
testCreateModel model = new testCreateModel();
return View(model);
}
xem Razor của tôi (phần không liên quan đã bị xóa) là:
@model Tasks.Models.testCreateModel
@using (Html.BeginForm()) {
<fieldset>
<legend>testCreateModel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.s1)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.s1)
</div>
<div class="editor-label">
Select an item:
</div>
<div class="editor-field">
@Html.DropDownList("dropdownlist", (SelectList)Model.DL)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
hành động bài lại là:
public ActionResult testCreate(testCreateModel model, FormCollection collection)
{
if (ModelState.IsValid)
{
Console.WriteLine("SelectedValue: ",model.DL.SelectedValue);
Console.WriteLine("FormCollection:", collection["dropdownlist"]);
// update database here...
}
return View(model);
}
Khi đăng lại, model.DL.SelectedValue là null. (Tuy nhiên, mục đã chọn có thể thu được từ FormCollection, nhưng đó là ngoài điểm). Đối tượng DL vẫn được điền đúng cách, Cửa sổ ngay lập tức xuất như sau:
model.DL
{System.Web.Mvc.SelectList}
base {System.Web.Mvc.MultiSelectList}: {System.Web.Mvc.SelectList}
SelectedValue: null
model.DL.Items
Count = 2
[0]: {[1, Item 1]}
[1]: {[2, Item 2]}
model.DL.SelectedValue
null
Q1: Làm cách nào để sử dụng thuộc tính SelectedValue?
Bây giờ, nếu trong giao diện Razor tôi thay đổi tên của thẻ Html SELECT để DL (tức là giống như tên thuộc tính trong mô hình):
@Html.DropDownList("DL", (SelectList)Model.DL)
tôi nhận được một ngoại lệ:
No parameterless constructor defined for this object.
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.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +199
System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext controllerContext, ModelBindingContext bindingContext, ValueProviderResult
...
Q2: Tại sao?
Cảm ơn.
Cảm ơn bạn đã sử dụng phương pháp được đề xuất sử dụng danh sách thả xuống. Nó hoạt động và có ít công việc cần thiết để nhận giá trị đã chọn! –
Xin cảm ơn, đây là bài viết hay nhất mà tôi đã giới thiệu về việc sử dụng danh sách thả xuống trong mvc –