[asp.net] HTTPPOST, 사전 또는에서 양식 값을 검색하는 방법은 무엇입니까?

이 작업 방법이있는 MVC 컨트롤러가 있습니다.

[HttpPost]
public ActionResult SubmitAction()
{
     // Get Post Params Here
 ... return something ...
}

양식은 단순한 텍스트 상자가있는 사소한 양식입니다.

질문

매개 변수 값에 어떻게 액세스합니까?

보기에서 게시하지 않고 게시물이 외부에서 제공됩니다. 액세스 할 수있는 키 / 값 쌍 모음이 있다고 가정합니다.

시도 Request.Params.Get("simpleTextBox");했지만 “죄송합니다. 요청을 처리하는 동안 오류가 발생했습니다.”라는 오류가 표시됩니다.



답변

컨트롤러 작업이 양식 입력 이름을 반영하는 개체를 취하도록 할 수 있으며 기본 모델 바인더가 자동으로이 개체를 생성합니다.

[HttpPost]
public ActionResult SubmitAction(SomeModel model)
{
    var value1 = model.SimpleProp1;
    var value2 = model.SimpleProp2;
    var value3 = model.ComplexProp1.SimpleProp1;
    ...

    ... return something ...
}

또 다른 (분명히 추악한) 방법은 다음과 같습니다.

[HttpPost]
public ActionResult SubmitAction()
{
    var value1 = Request["SimpleProp1"];
    var value2 = Request["SimpleProp2"];
    var value3 = Request["ComplexProp1.SimpleProp1"];
    ...

    ... return something ...
}


답변

간단히 다음 FormCollection과 같이 사용할 수 있습니다 .

[HttpPost]
public ActionResult SubmitAction(FormCollection collection)
{
     // Get Post Params Here
 string var1 = collection["var1"];
}

Form 값으로 매핑 된 클래스를 사용할 수도 있으며 asp.net mvc 엔진이 자동으로 채 웁니다.

//Defined in another file
class MyForm
{
  public string var1 { get; set; }
}

[HttpPost]
public ActionResult SubmitAction(MyForm form)
{
  string var1 = form1.Var1;
}


답변

대답은 매우 좋지만 MVC 및 .NET의 최신 릴리스에는 “오래된 학교”FormCollection 및 Request 키 대신 사용하고 싶은 또 다른 방법이 있습니다.


AJAX 또는 FORM POST를 수행하는 양식 태그 내에 포함 된 HTML 스 니펫을 고려하십시오.

<input type="hidden"   name="TrackingID"
<input type="text"     name="FirstName"  id="firstnametext" />
<input type="checkbox" name="IsLegal"  value="Do you accept terms and conditions?" />

컨트롤러는 실제로 양식 데이터를 구문 분석하고 정의 된 유형의 매개 변수로 전달하려고합니다. 까다로운 체크 박스를 포함 시켰습니다. 선택하면 “on”텍스트를 반환하고 선택하지 않으면 null을 반환합니다. 그러나 요구 사항은 이러한 정의 된 변수가 반드시 존재해야한다는 것입니다 (nullable (nullable이더라도 기억 string)하지 않는 한) 그렇지 않으면 AJAX 또는 POST 백이 실패합니다.

[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
    MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}

면도기 도우미를 사용하지 않고 모델을 다시 게시 할 수도 있습니다. 나는 이것이 몇 번 필요하다는 것을 알게되었습니다.

public Class HomeModel
{
  public int HouseNumber { get; set; }
  public string StreetAddress { get; set; }
}

HTML 마크 업은 단순히 …

<input type="text" name="variableName.HouseNumber" id="whateverid" >

컨트롤러 (Razor Engine)는 양식 변수 “variableName”(이름은 원하는대로 유지하지만 일관성을 유지)을 가로 채서이를 빌드하고 MyModel로 캐스트합니다.

[HttpPost]
public ActionResult PostBack(HomeModel variableName){
    postBack.HouseNumber; //The value user entered
    postBack.StreetAddress; //the default value of NULL.
}

컨트롤러가 모델 (이 경우 HomeModel)을 예상 할 때 모든 필드를 정의 할 필요가 없습니다. 파서가 기본값 (일반적으로 NULL)으로두기 때문입니다. 좋은 점은 마크 업에서 다양한 모델을 혼합하고 일치시킬 수 있으며 포스트 백 구문 분석이 가능한 한 많이 채워질 것입니다. 페이지에서 모델을 정의하거나 도우미를 사용할 필요가 없습니다.

팁 : 컨트롤러의 매개 변수 이름은 HTML 마크 업 “name =”에 정의 된 이름입니다. 모델 이름이 아니라!에서 예상되는 변수의 이름입니다.


사용 List<>은 마크 업에서 조금 더 복잡합니다.

<input type="text" name="variableNameHere[0].HouseNumber" id="id"           value="0">
<input type="text" name="variableNameHere[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="variableNameHere[2].HouseNumber"                   value="2">
<input type="text" name="variableNameHere[3].HouseNumber" id="whateverid22" value="3">

List <>의 인덱스는 항상 0부터 시작해야하며 순차적이어야합니다. 0,1,2,3.

[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
     int counter = MyHomes.Count()
     foreach(var home in MyHomes)
     { ... }
}

사용 IEnumerable<>비 제로를위한 것은 기반 및 비 순차적 인덱스 다시 게시 할 수 있습니다. 바인더를 돕기 위해 숨겨진 추가 입력을 추가해야합니다.

<input type="hidden" name="variableNameHere.Index" value="278">
<input type="text" name="variableNameHere[278].HouseNumber" id="id"      value="3">

<input type="hidden" name="variableNameHere.Index" value="99976">
<input type="text" name="variableNameHere[99976].HouseNumber" id="id3"   value="4">

<input type="hidden" name="variableNameHere.Index" value="777">
<input type="text" name="variableNameHere[777].HouseNumber" id="id23"    value="5">

그리고 코드는 IEnumerable을 사용하고 ToList()

[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
     int counter = variableNameHere.ToList().Count()
     foreach(var home in variableNameHere)
     { ... }
}

페이지 당 단일 모델 또는 ViewModel (다른 모델을 연결하여 복잡한 ‘View’모델을 생성하는 모델)을 사용하는 것이 좋습니다. 제안 된대로 믹싱 및 매칭은 나쁜 습관으로 간주 될 수 있지만 작동하고 읽을 수있는 한 나쁜 것은 아닙니다. 그러나 Razor 엔진의 힘과 유연성을 보여줍니다.

따라서 임의의 항목을 드롭하거나 Razor 도우미의 다른 값을 재정의해야하거나 비정상적인 데이터 조합을 사용하는 단일 양식에 대해 고유 한 도우미를 만들고 싶지 않은 경우 이러한 메서드를 사용하여 추가 데이터.


답변

모델 바인딩없이 Http 요청에서 직접 양식 데이터를 가져 오려면 FormCollection다음을 사용할 수 있습니다.

[HttpPost]
public ActionResult SubmitAction() {

    // This will return an string array of all keys in the form.
    // NOTE: you specify the keys in form by the name attributes e.g:
    // <input name="this is the key" value="some value" type="test" />
    var keys = Request.Form.AllKeys;

    // This will return the value for the keys.
    var value1 = Request.Form.Get(keys[0]);
    var value2 = Request.Form.Get(keys[1]);
}


답변