강력한 형식의보기에서 DropDownList 백 게시
Nov 24 2020
이것은 데이터베이스에서 드롭 다운 목록을 바인딩 하는 이전 질문 과 관련이 있습니다. 드롭 다운 목록이 바인딩되고 채워지지만 양식을 제출할 때 브라우저에서 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."오류가 발생합니다.
디버깅 할 때 Html.DropDownListFor (...) 도우미 메서드의 m => m.SelectedDepartment 매개 변수에 대한 빠른 조사를 추가하고 "대리자 형식이 아니기 때문에 람다 식을 '개체'형식으로 변환 할 수 없습니다." .
전망:
@model BudgetDemo.Models.BudgetsActualsViewModel
@using (Html.BeginForm("GetBudgetsActuals", "BudgetsActuals", FormMethod.Post))
{
@Html.DropDownListFor(m => m.SelectedDepartment, Model.Departments,
"Select Department", new { @class = "form-control" })
}
ViewModel :
public class BudgetsActualsViewModel
{
[Display(Name = "Cost Center/Department")]
[Required(ErrorMessage = "Cost Center/Department is required.")]
[StringLength(62)]
public string SelectedDepartment { get; set; }
public List<SelectListItem> Departments { get; set; }
}
제어 장치:
// GET: Render view with dropdowns
public ActionResult GetBudgetsActuals()
{
repo = new BudgetDemoRepository();
ModelState.Clear();
try
{
return View(repo.GetBudgetsActuals());
}
catch
{
return View("Error");
}
}
저장소:
public BudgetsActualsViewModel GetBudgetsActuals()
{
...
BudgetsActualsViewModel budgetsActuals = new BudgetsActualsViewModel()
{ Departments = new List<SelectListItem>() };
// Query returning correct data from DB here
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
budgetsActuals.Departments.Add(
new SelectListItem
{
Text = ds.Tables[0].Rows[i]["Department"].ToString(),
Value = ds.Tables[0].Rows[i]["ListValue"].ToString()
}
);
}
return budgetsActuals;
}
최신 정보
지금 작동하고 있습니다. 다음 코드는 선택한 부서의 값을 포함하는 성공 메시지와 함께 포스트 백 후 다시 렌더링되는 양식을 가져 오기 위해 업데이트 / 추가되었습니다.
전망:
@model BudgetDemo.Models.BudgetsActualsViewModel
@Html.AntiForgeryToken()
@using (Html.BeginForm("GetBudgetsActuals", "BudgetsActuals",
FormMethod.Post))
{
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@if (TempData["SuccessMessage"] != null)
{
<p class="alert alert-success"
id="successMessage">@TempData["SuccessMessage"]</p>
}
@Html.DropDownListFor(m => m.SelectedDepartment, Model.Departments,
"Select Department", new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.SelectedDepartment, "",
new { @class = "text-danger" })
}
컨트롤러 :
// GET
public ActionResult GetBudgetsActuals()
{
Populate Department dropdown from DB and Year dropdown (static) here
repo = new BudgetDemoRepository();
//ModelState.Clear();
try
{
return View(repo.GetBudgetsActuals());
}
catch
{
return View("Error");
}
}
// POST
[HttpPost]
public ActionResult GetBudgetsActuals(BudgetsActualsViewModel model)
{
try
{
repo = new BudgetDemoRepository();
if (ModelState.IsValid)
{
TempData["SuccessMessage"] = "Value of SelectedDepartment is: "
+ model.SelectedDepartment;
return View(repo.GetBudgetsActuals(model));
}
else
{
model.Departments = repo.GetBudgetsActuals().Departments;
return View(model);
}
}
catch
{
return View("Error");
}
}
리포지토리-POST 를 처리하기위한 새로운 오버로드 된 메서드
public BudgetsActualsViewModel GetBudgetsActuals(BudgetsActualsViewModel model)
{
....
// Get the data again
....
budgetsActuals.SelectedDepartment = model.SelectedDepartment;
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
budgetsActuals.Departments.Add(
new SelectListItem
{
Text = ds.Tables[0].Rows[i]["Department"].ToString(),
Value = ds.Tables[0].Rows[i]["ListValue"].ToString()
}
);
}
return budgetsActuals;
}
답변
1 JamshaidK. Nov 24 2020 at 15:58
호출 controller
을 지원하는 새 API를 갖도록 수정하십시오 POST
. 다음과 같이하십시오.
다음과 같이 뷰가로드 될 때 호출되는 get 메서드를이 메서드에 추가합니다.
[HttpGet]
public ActionResult GetBudgetsActuals()
{
repo = new BudgetDemoRepository();
ModelState.Clear();
try
{
return View(repo.GetBudgetsActuals());
}
catch
{
return View("Error");
}
}
양식이 제출 될 때 호출되는 post 메소드를 추가하십시오.
[HttpPost] // Decorate with this attribute
public ActionResult PostBudgetsActuals(BudgetDemo.Models.BudgetsActualsViewModel model)
{
var selectedDepartment = model.SelectedDepartment;
// dostuff with the model
return somethingFromHere;
}
다음과 같이보기를 변경합니다.
@model BudgetDemo.Models.BudgetsActualsViewModel
@using (Html.BeginForm("PostBudgetsActuals", "BudgetsActuals", FormMethod.Post))
{
@Html.DropDownListFor(m => m.SelectedDepartment, Model.Departments,
"Select Department", new { @class = "form-control" })
}
DropDownListFor
메서드 오버로드에 문제가있는 경우 DropDownList
아래와 같은 방법 을 시도해 볼 수도 있습니다.
@using (Html.BeginForm("PostBudgetsActuals", "BudgetsActuals", FormMethod.Post))
{
@Html.DropDownList("SelectedDepartment", Model.Departments,
"Select Department", new { @class = "form-control" })
}
최신 정보
// POST
[HttpPost]
public ActionResult GetBudgetsActuals(BudgetsActualsViewModel model)
{
try
{
repo = new BudgetDemoRepository();
if (model.SelectedDepartment != null)
{
TempData["SuccessMessage"] = "Value of SelectedDepartment is:
" + model.SelectedDepartment;
}
model.Departments = repo.GetBudgetsActuals().Departments;
return View(model);
}
catch
{
return View("Error");
}
}