ASP.NET MVC 2를 사용하여 Linq-2-SQL로 매핑 된 데이터베이스에서 드롭 다운 목록을 채우려 고하는데이 오류가 계속 발생합니다.
IEnumerable<SelectListItem>
두 번째 줄 에 유형 변수를 선언했기 때문에 혼란 스럽지만 오류로 인해 이것이 사실이 아니라고 생각합니다. 나는 이것이 매우 간단해야한다고 생각하지만 어려움을 겪고 있습니다. 도움을 주시면 감사하겠습니다.
내 컨트롤러의 흥미로운 부분은 다음과 같습니다.
public ActionResult Create()
{
var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;
return View();
}
그리고 여기 내 흥미로운 부분이 있습니다.
<div class="editor-label">
<%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
<%: Html.DropDownList("basetype") %>
<%: Html.ValidationMessageFor(model => model.basetype) %>
</div>
다음은 양식을 제출할 때 POST 조치입니다.
// POST: /Meals/Create
[HttpPost]
public ActionResult Create(Meal meal)
{
if (ModelState.IsValid)
{
try
{
// TODO: Add insert logic here
var db = new DB();
db.Meals.InsertOnSubmit(meal);
db.SubmitChanges();
return RedirectToAction("Index");
}
catch
{
return View(meal);
}
}
else
{
return View(meal);
}
}
감사.
답변
나는 같은 문제가 있었고 마침내 대답을 얻었습니다 …
문제는 POST 조치에서 양식을 제출 한 후 ModelState가 유효하지 않거나 try / catch에서 오류를 발견하여보기가 리턴된다는 것입니다. 그러나 이번에는보기가 ViewData["basetype"]
올바르게 설정 되지 않았습니다 .
이전에 사용한 것과 동일한 코드로 다시 채워야하므로이를 반복하십시오.
var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;
전과 return View(meal)
의 [HttpPost]
방법.
정확히 이것은 당신의 문제를 해결할 것입니다 :
[HttpPost]
public ActionResult Create(Meal meal)
{
if (ModelState.IsValid)
{
try
{
// TODO: Add insert logic here
var db = new DB();
db.Meals.InsertOnSubmit(meal);
db.SubmitChanges();
return RedirectToAction("Index");
}
catch
{
var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;
return View(meal);
}
}
else
{
var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;
return View(meal);
}
}
나는이 질문이 매우 오래되었다는 것을 알고 있지만 오늘 같은 문제로 여기에 왔으므로 나중에 다른 사람들이 여기에 올 수 있습니다 …
답변
SelectList가 null 인 경우이 오류가 발생합니다.
답변
방금이 문제를 겪었고이 기사가 도움이되었습니다 -http : //odetocode.com/Blogs/scott/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc. aspx
Po 이후에 컬렉션이 다시 채워질 가능성이 가장 높습니다.
답변
향후 독자를 위해 면도기를 사용하는 경우 선택 목록 항목 유형을 목록에서 IEnumerable로 변경하십시오.
에서
@Html.DropDownListFor(m => m.id, ViewBag.SomeList as List<SelectListItem>)
에
@Html.DropDownListFor(m => m.id, ViewBag.SomeList as IEnumerable<SelectListItem>)
답변
드롭 다운 목록의 이름에 대한 문자열을 첫 번째 매개 변수로 추가하고 항목을 뷰 데이터에서 가져옵니다.
<%= Html.DropDownList("SomeDropdownName", (IEnumerable<SelectListItem>)ViewData["basetype"]) %>
다음은 또한 사용할 수있는 확장 방법이므로 드롭 다운 목록은 다른 컨트롤을 수행 한 방법과 유사한 스타일로 설정됩니다.
public static string DropDownList<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel)
where TModel : class
{
string inputName = ExpressionHelper.GetInputName(expression);
return htmlHelper.DropDownList(inputName, selectList, optionLabel);
}
예를 들어
<%= Html.DropDownList(x => x.BaseType, (IEnumerable<SelectListItem>)ViewData["basetype"], "")%>
답변
컬렉션을 ViewData 사전의 항목으로 설정하고 모델의 속성으로 검색하려고합니다. 간단한 수정은 설정 한 것과 같은 방식으로 참조하는 것입니다.
<%var basetype = ViewData["basetype"] as IEnumerable<SelectListItem>;%>
<div class="editor-label">
<%: Html.Label("basetype") %>
</div>
<div class="editor-field">
<%: Html.DropDownList("basetype", basetype) %>
<%: Html.ValidationMessage("basetype") %>
</div>
또는 아래 코드는 강력한 형식의 뷰를 사용합니다.
public class ViewModel {
//Model properties
public IEnumerable<SelectListItem> basetype {get;set;}
}
public ActionResult Create()
{
var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(b => new SelectListItem { Value = b.basetype, Text = b.basetype });
return View(new ViewModel { basetype=basetypes });
}
그런 다음 강력하게 입력 한 관점에서 :
<div class="editor-label">
<%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
<%: Html.DropDownListFor(model=>model.basetype) %>
<%: Html.ValidationMessageFor(model => model.basetype) %>
</div>
답변
Html.DropDownList()
메소드 를 사용 하는 경우 @Peto가 응답 한 것처럼 ViewData / Viewbag 항목이 설정되지 않은 경우 동일한 오류가 발생할 수 있습니다.
그러나 컨트롤러 설정 항목의 경우 올바르게 설정되지 않을 수 있지만 주보기에서는 새로운 ViewDataDictionary 값으로 부분 viw 호출을 사용합니다.
당신이있는 경우 @Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })
다음 부분보기가 표시되지 않습니다 ViewData
및 ViewBag
데이터 제거 new ViewDataDictionary()
매개 변수