ASP.Net MVC 뷰에서 컨트롤러로 데이터를 전달하는 방법 [닫힌]


81

저는 ASP.Net을 완전히 처음 사용하고 이것이 매우 기본적인 질문이라고 확신합니다. 보고서를 생성 할 수있는 링크가 있지만 보고서를 생성 할 수 있으려면 사용자에게 적절한 텍스트 이름을 제공하도록 요청해야합니다. 잘.

지금까지 컨트롤러에서 전달 된 모델을 사용하여 서버에서 뷰로 데이터를 전달할 수 있었지만 뷰에서 컨트롤러로 데이터를 전달하는 방법을 잘 모르겠습니다.

이 경우 뷰에서 컨트롤러로 문자열을 전달하면됩니다.

예를 들어 조언을 주시면 감사하겠습니다.

최신 정보

데이터를 서버에 다시 게시해야한다는 것을 이해하지만 razorhtml 코드 및 컨트롤러의 형태로 어떻게 실현됩니까?


사용자는 무언가를 게시해야합니다. 뷰는 컨트롤러와 통신하는 방법을 직접 알지 못합니다.
Daniel A. White

Microsoft 문서를 읽으면이를 수행하는 방법을 설명하지 않는다는 것을 알 수 있습니다.
Paul McCarthy

답변:


133

컨트롤러에서보기 위해 데이터를 전달하는 방법과 같이 ViewModels로이를 수행 할 수 있습니다.

이와 같은 뷰 모델이 있다고 가정하십시오.

public class ReportViewModel
{
   public string Name { set;get;}
}

그리고 GET Action에서

public ActionResult Report()
{
  return View(new ReportViewModel());
}

보기는 강력하게 입력해야합니다. ReportViewModel

@model ReportViewModel
@using(Html.BeginForm())
{
  Report NAme : @Html.TextBoxFor(s=>s.Name)
  <input type="submit" value="Generate report" />
}

컨트롤러 의 HttpPost 작업 메서드에서

[HttpPost]
public ActionResult Report(ReportViewModel model)
{
  //check for model.Name property value now
  //to do : Return something
}

또는 간단히 POCO 클래스 (Viewmodels)없이이를 수행 할 수 있습니다.

@using(Html.BeginForm())
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

HttpPost 작업에서 텍스트 상자 이름과 동일한 이름의 매개 변수를 사용하십시오.

[HttpPost]
public ActionResult Report(string reportName)
{
  //check for reportName parameter value now
  //to do : Return something
}

편집 : 코멘트에 따라

다른 컨트롤러에 게시 하려면 BeginForm 메서드 의이 오버로드 를 사용할 수 있습니다 .

@using(Html.BeginForm("Report","SomeOtherControllerName"))
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

액션 메소드에서 데이터를보기 위해 전달합니까?

동일한 뷰 모델을 사용할 수 있으며 GET 작업 메서드에서 속성 값을 설정하기 만하면됩니다.

public ActionResult Report()
{
  var vm = new ReportViewModel();
  vm.Name="SuperManReport";
  return View(vm);
}

그리고 당신의 관점에서

@model ReportViewModel
<h2>@Model.Name</h2>
<p>Can have input field with value set in action method</p>
@using(Html.BeginForm())
{
  @Html.TextBoxFor(s=>s.Name)
  <input type="submit" />
}

제시 한 옵션 / 방법 2 (모델 제외)에서 컨트롤러 이름을 지정하는 방법이 있습니까? 이 게시물 요청을 받아야하는 컨트롤러가이 뷰의 컨트롤러와 다르기 때문에 ..
Ahmed

@Ahmed : 업데이트 된 답변을 확인하십시오. BeginForm 메서드의 특정 오버로드를 사용할 수 있습니다.
Shyju 2013

4
당신의 좋은 답변 우수한 감사합니다 ..
아메드

좋아, 나는 지금 몇 시간 동안 찾고 있었다. 감사!
Dan Beaulieu

감사!! 아주 명확한 대답입니다. 제 경우에는 HttpPost 작업에서 텍스트 상자 이름과 같은 이름의 매개 변수를 사용할 필요가 없었습니다. 모델 객체를 매개 변수로만 입력하면 값을 검색 할 수 있습니다.
Hnin Htet Htet Aung

27

게시를 원하지 않거나 필요하지 않은 경우 :

@Html.ActionLink("link caption", "actionName", new { Model.Page })  // view's controller
@Html.ActionLink("link caption", "actionName", "controllerName", new { reportID = 1 }, null);

[HttpGet]
public ActionResult actionName(int reportID)
{

새 {} 부분의 reportID는 작업 매개 변수의 reportID와 일치합니다.이 방법으로 매개 변수를 얼마든지 추가 할 수 있지만 2 개 또는 3 개 이상 (일부는 항상 논쟁을 벌임) POST를 통해 모델을 전달해야합니다 ( 다른 답변에 따라)

편집 : 주석에서 지적한대로 올바른 오버로드를 위해 null을 추가했습니다. 많은 오버로드가 있으며 action + controller를 모두 지정하면 routeValues와 htmlAttributes가 모두 필요합니다. 컨트롤러가 없으면 (캡션 + 액션 만) routeValues ​​만 필요하지만 항상 둘 다 지정하는 것이 가장 좋습니다.


4
이 간단한 대답을 접하는 사람에게 참고로하여 경로 값을 포함시킨 후 null을 추가하십시오 [new {reportID = 1}]. 그렇지 않으면 htmlAttributes로 가져 오려고 시도하고 통과하지 않습니다.
Hardycore

22
<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

제어 장치:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}

1
<input type = "valueINeed"type = "text">는 <input name = "valueINeed"type = "text">
여야합니다.

Thnx. 업데이트 된 응답.
Azure SME
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.