보기에서 컨트롤러로 데이터를 전달합니다
-
10-07-2019 - |
문제
ASP.NET MVC 응용 프로그램에서 관리자가 신입 회원을 수락하거나 거부 할 수있는 논리를 만들고 있습니다. 멤버 목록과 두 개의 버튼이 다음과 같이 수락하고 거부합니다.
<% foreach (var mm in (ViewData["pendingmembers"] as List<MyMember>)) %>
<% { %>
<tr><td>Username:<%=mm.UserName %></td><td>
<tr><td>Firstname:<%=mm.FirstName %></td><td>
...etc...
<tr>
<td>
<% using (Html.BeginForm("AcceptPendingUser", "Admin"))
{ %>
<input type="submit" value="Accept" />
<% } %>
</td>
<td>
<% using (Html.BeginForm("RejectPendingUser", "Admin"))
{ %>
<input type="submit" value="Reject" />
<% } %>
</td>
</tr>
<% } %>
따라서 보류중인 회원 데이터 목록은 MyMember-Objects 목록에 있습니다. 각 MyMember 객체는 멤버로 인쇄되고 관리자가 보류중인 멤버를 수락하거나 거부 할 수 있도록 두 개의 버튼이 설정됩니다.
그런 다음 컨트롤러에서 다음과 같은 두 입력 필드/양식의 처리를 분리합니다.
public ActionResult AcceptPendingUser()
{
// TODO: Add code to save user into DB and send welcome email.
return RedirectToAction("Index");
}
public ActionResult RejectPendingUser()
{
// TODO: Add code to remove user from PendingUsers list and send rejection email.
return RedirectToAction("Index");
}
사용자가 누르는 버튼 옆에 객체를 직접 가져오고 싶습니다. 보기에서 컨트롤러로 MyMember 객체를 어떻게 보낼 수 있습니까? 아니면 버튼 프레스와 함께 숫자 색인을 어떻게 보내나요? 어쩌면 숨겨진 필드가 있을까요?
해결책
가장 간단한 옵션은 아마도 숨겨진 입력 일 것입니다.
<input type="hidden" value="<%=mm.Key%>" name="key" id="key" />
(그에 따라 이름; 각 형태로)
그런 다음 두 컨트롤러는 "키"라는 인수를받습니다 (이름 바꾸기). 여러 입력에서 객체를 구문 분석하려면 ModelBinder
. 물론, 2*n 양식이 아니라 쿼리 스트링 기반 URL을 고려하거나 jQuery (또는 다른 스크립트 도우미)와 같은 것을 고려하여 양식을 사용할 필요없이 데이터를 제출할 수 있습니다 (스크립트를 사용할 수있는 경우).
다른 팁
HTML 버튼을 사용하는 대신 ActionLink를 사용하여 승인 된 멤버의 ID를 포함하도록 구성하는 것을 고려하십시오. 또 다른 대안은 관리자가 각 멤버를 승인 할 수 있도록 각 멤버에 대해 선택할 수있는 체크 박스 (값이 승인 된 ID)를 갖는 것입니다.
나 자신과 다른 MVC 초보자에게 대답 :
마침내이 코드로 작업했습니다.
보다:
<%=Html.ActionLink(
"Jump",
"Jump",
new { name=(ViewData["Person"] as Person).Name,
person=ViewData["Person"]},
null) %>
제어 장치:
public ActionResult Index()
{
ViewData["Title"] = "Home Page";
ViewData["Message"] = "Welcome to ASP.NET MVC!";
Person p = new Person();
p.Name = "Barrack";
p.Age = 35;
ViewData["Person"] = p;
return View();
}
public ActionResult Jump(string name, Person person)
{
return View();
}
Jump Method에서 앱을 디버깅하면 이름 매개 변수에 대한 "Barrack"-String이지만 NULL의 Person Parameter가 제공됩니다.
또한 친절한 댓글 작성자가 설명하려고 한 내용을 이해합니다. 문자열 및 int와 같은 간단한 데이터 유형을 컨트롤러로 보내는 것은 쉽지만 내 사람과 같은 복잡한 유형은 다른 것을 필요로합니다.
기본적으로 int를 통과하면 충분합니다. 여기서 가장 어려운 부분은 ActionLink를 설정하는 올바른 방법을 찾는 것이 었습니다.
건배, pom