经过几年的网络开发后,我非常沮丧地试图转向MVC。
这是我无法解决的极其简单的问题: 我有一个名为StateProvince的表中的状态列表。 我有一个DropDownList。 我希望DropDownList显示所有状态。
保持简单,我对MVC一无所知。
这就是我所拥有的。所有这些给了我一个DropDownList填充“System.Web.Mvc.SelectListItem”。
行动:
public ActionResult Create()
{
var dbTimecard = new TimecardDbDataContext();
IEnumerable<SelectListItem> stateProvinces = dbTimecard.StateProvinces.Select(p => new SelectListItem
{
Value = p.StateProvinceId.ToString(),
Text = p.Name
});
SelectList theList = new SelectList(stateProvinces);
ViewData["StateProvince"] = theList;
return View();
}
查看:
<div class="editor-label">
<%: Html.LabelFor(model => model.StateProvinceId) %>
</div>
<div class="editor-field">
<%: Html.DropDownListFor(model => model.StateProvinceId, (SelectList)ViewData["StateProvince"])%>
<%: Html.ValidationMessageFor(model => model.StateProvinceId) %>
</div>
答案 0 :(得分:1)
以下是我要找的内容:
动作:
public ActionResult Create()
{
var dbTimecard = new TimecardDbDataContext();
IEnumerable<SelectListItem> stateProvinces = dbTimecard.StateProvinces.Select(p => new SelectListItem
{
Value = p.StateProvinceId.ToString(),
Text = p.Name
});
ViewData["StateProvince"] = stateProvinces;
return View();
}
查看:
<div class="editor-field">
<%: Html.DropDownListFor(model => model.StateProvinceId, (IEnumerable<SelectListItem>)ViewData["StateProvince"])%>
<%: Html.ValidationMessageFor(model => model.StateProvinceId) %>
</div>
答案 1 :(得分:1)
尝试替换此
SelectList theList = new SelectList(stateProvinces);
有了......
SelectList theList = new SelectList(stateProvinces, "Value", "Text");
答案 2 :(得分:0)
常见浏览器不支持HTML表单中的PUT
动词。您可能需要使用ajax处理此问题:
$(function() {
// when some button is clicked:
$('#someButton').click(function() {
$.ajax({
url: '/controller/action',
data: { selectedState: $('#StateProvinceId').val() },
type: 'PUT',
success: function(data) {
alert('state successfully submitted');
}
});
return false;
});
});
答案 3 :(得分:0)
发布数据时,DropDown
中列出的项目不会回发到模型中,因此我假设您没有再次获取它们并将其重新添加到模型中,然后再将模型返回到模型中观点。
您需要在帖子上确认您正在填充Model.StateProvinces
,然后将其传递给您的视图。与WebForms不同,只保留值,这将保留DropDownList
中的ViewState
项并为您重建它们。
所以假设您的控制器看起来像:
// POST: /YourController/YourAction/{ID}
[HttpPost]
public ActionResult YourAction(YourModel model, int id)
{
// model.StateProvinceId has the selected value
// you need to fill StateProvinces since it is empty as the list is not posted
// back so it is not autofilled into your model.
model.StateProvinces = LoadYourStateProvincesList();
// This would blow up if StateProvinces is null because your View is assuming that
// it has a valid list of StateProvinces in it to build the DropDown
return View(model);
}
我实际上回答了一段时间的问题,这可能有助于解释如何处理DropDown列表:
Best way of implementing DropDownList in ASP.NET MVC 2?
编辑:根据您的评论,您甚至没有获得第一个列表...好吧,您可能没有正确设置模型。你有模特吗?您的创建只返回View()
,其中没有模型数据。您需要创建一个模型并将其返回。
例如
public class YourModel
{
public int StateProvinceId { get; set; }
/// ... whatever else you need
}
// Then in your view your controller you need to set it and create it
View(new YourModel() { StateProvinceId = 123 };);
你需要这个模型,这样当表单被回发时,你可以检索这个值,因为MVC会将值填充到你的模型中,就像我上面发布的关于POST部分的例子一样。
编辑:好了,现在这个问题比原来的问题更清晰,更容易解决问题。问题是你的SelectList需要告诉它哪些字段放在哪里:
SelectList theList = new SelectList(stateProvinces, "Value", "Text");
在原来的问题中你有:
<%: Html.DropDownListFor(model => model.StateProvinceId, new SelectList(Model.StateProvinces, "StateProvinceId", "Name") )%>
这是完全正确的但是你是如何构建错误的Model.StateProvinces所以它让我不再认为它必须是别的东西。