Old*_*zer 6 null selectedvalue razor asp.net-mvc-3 drop-down-menu
我的模型如下:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
我的启动行动是:
public ActionResult testCreate()
{
testCreateModel model = new testCreateModel();
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
我的剃刀视图(删除了相关部分)是:
@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>
}
Run Code Online (Sandbox Code Playgroud)
回发行动是:
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);
}
Run Code Online (Sandbox Code Playgroud)
在回发后,model.DL.SelectedValue为null.(但是,可以从FormCollection中获取所选项目,但这不是重点).DL对象仍然正确填充,否则,立即窗口输出如下:
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
Run Code Online (Sandbox Code Playgroud)
Q1:如何使用SelectedValue属性?
现在,如果在Razor视图中我将Html SELECT标记的名称更改为DL(即与模型中的属性名称相同):
@Html.DropDownList("DL", (SelectList)Model.DL)
Run Code Online (Sandbox Code Playgroud)
我得到一个例外:
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
...
Run Code Online (Sandbox Code Playgroud)
Q2:为什么?
谢谢.
Leo*_*spo 11
MVC将仅返回POST中所选选项的值,因此您需要一个属性来包含返回的单个值.
作为一个好建议,尝试通过ViewBag设置SelectLists,这有助于保持ViewModel不受需要填充表单的数据的影响.
所以你的例子可以像这样解决:
public class testCreateModel
{
public string s1 { get; set; }
public int SelectedValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并在您的视图中执行此操作:
@Html.DropDownList("SelectedValue", (SelectList)ViewBag.DL)
Run Code Online (Sandbox Code Playgroud)
在您的GET操作中填充ViewBag.DL之前.
至于你的Q2,默认的ModelBinder要求所有要绑定的类型都有一个默认的构造函数(以便ModelBinder可以创建它们)
Bre*_*ogt 10
已经选择了答案,但请看我是如何做到的.下面是填写下拉列表时我通常如何做的代码.这是非常简单的,我建议你用它来建立你的下拉.
在我的视图顶部,我指定了我的视图模型:
@model MyProject.ViewModels.MyViewModel
Run Code Online (Sandbox Code Playgroud)
在我看来,我有一个下拉列表,显示用户可以选择的所有银行:
<table>
<tr>
<td><b>Bank:</b></td>
<td>
@Html.DropDownListFor(
x => x.BankId,
new SelectList(Model.Banks, "Id", "Name", Model.BankId),
"-- Select --"
)
@Html.ValidationMessageFor(x => x.BankId)
</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我总是有视图的视图模型,我从不直接将域对象传递给视图.在这种情况下,我的视图模型将包含将从数据库填充的银行列表:
public class MyViewModel
{
// Other properties
public int BankId { get; set; }
public IEnumerable<Bank> Banks { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的银行域名模型:
public class Bank
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后在我的action方法中,我创建了一个视图模型的实例,并从数据库中填充了银行列表.完成后,我将视图模型返回到视图:
public ActionResult MyActionMethod()
{
MyViewModel viewModel = new ViewModel
{
// Database call to get all the banks
// GetAll returns a list of Bank objects
Banks = bankService.GetAll()
};
return View(viewModel);
}
[HttpPost]
public ActionResult MyActionMethod(MyViewModel viewModel)
{
// If you have selected an item then BankId would have a value in it
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
| 归档时间: |
|
| 查看次数: |
15879 次 |
| 最近记录: |