2010-02-03 6 views
2

나는 내 웹 사이트의 여러 부분에서 필요한 양식을 가지고 있습니다.asp.net-mvc에서 재사용 가능한 섹션을 만드는 가장 좋은 방법

사용자가 주소를 입력하고 주소를 저장하는 양식을 제출하십시오. 몇 군데에서 똑같은 기능을 필요로하기 때문에 이것을 다시 사용할 수 있도록 포장하고 싶습니다.

내가이 일을 생각하고 :

  1. 는 매개 변수로 전달 작업 위치 URL을 형태와 부분 뷰를 만들 수 있지만이있다.

  2. 저장/편집이 이미 DB 층에 처리됩니다 (UI 이미 jQuery를 사용하여 자신의 검증을 가지고) 서버 측 유효성 검사를 처리하는 별도의 클래스/메소드를 만듭니다.

누구나 더 좋은 방법이 있습니까?

답변

1

ASP.NET MVC는 컨벤션 오버 규칙을 사용하므로이를 사용하여 주소 형식을 다른 작업에 제출할 수 있습니다. 그래서 만약 당신이 천국 조치 :

public ActionResult Foo() 
{ 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public void Foo(string address) 
{ 
//code to update address 
} 

귀하의 Foo.aspx보기 주소 부분보기를 포함, 당신이 당신의 부분보기에서 양식을 작성하는 헬퍼 메소드를 사용 :

<% using(Html.BeginForm()){ %> 
. 
. 
. 
<%}%> 

그런 다음 양식이 게시되면 HTTP Post를 승인하는 Foo 조치를 요청할 수 있습니다.

또한 당신의 페이지를 제공하고 포스트 데이터를 수용하기 위해 두 개의 새로운 행동과 주소 부분보기를 포함 Bar.aspx라는 새로운 뷰를 작성하는 경우

이제 :

public ActionResult Bar() 
{ 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public void Bar(string address) 
{ 
//code to update address 
} 

당신은 필요가 없습니다/MyController/Foo에서 제공 될 때, Html.BeginForm은/MyController/Foo를 액션으로 렌더링 할 때와 같이 네임 컨벤션을 사용하여 프레임 워크가 게시 할 곳을 지정하기 위해 부분 뷰에 데이터를 전달합니다. 에 게시/MyController/Bar와 동일합니다.

희망이 있습니다.

0

나는 종종 여러 장소에서 양식을 작성하고 별도의 ViewModel을 사용하여 해당 명령을 실행합니다. 하지만 프로젝트에서 높은 수준의 복제가 지나치게 두렵지는 않습니다. 이는 개인적인 취향입니다.

당신의보기 모델에 주소라는 개체가 있다고 가정하는 부분보기를 사용하여 그 이름에 바인딩 된 이름 앞에 접두사를 사용하여 제안하고 싶습니다.

보기 모델의 해당 개체는 주소가 필요한 모든보기 모델에서 사용되는 공유 개체 일 수 있습니다. 편의상 "주소"라는 유형의 "AddressViewModelComponent"유형을 가정 해 봅시다.

public class SomeViewModel 
    { 
     public string SomeFormValue 
     { 
      get; 
      set; 
     } 

     public string SomeOtherFormValue 
     { 
      get; 
      set; 
     } 

     public AddressViewModelComponent Address 
     { 
      get; 
      set; 
     } 

    } 

    public class AddressViewModelComponent 
    { 
     public string AddressLineOne 
     { 
      get; 
      set; 
     } 

     public string AddressLineTwo 
     { 
      get; 
      set; 
     } 

     // Etc 
    } 

당신이 그것을 필요로하고 부분보기 같은 것을 포함 할 수있는 뷰 모델에 주소를 넣을 수 있습니다이 방법은 다음

<li><%= Html.TextBox("Address.AddressLineOne") %></li> 
<li><%= Html.TextBox("Address.AddressLineTwo") %></li>  

귀하의 실제보기 양식은 다음과 같이 보일 것입니다 :

<% using(Html.BeginForm()) %> 
<ul> 
<li><%= Html.TextBox("SomeFormValue") %></li> 
<li><%= Html.TextBox("SomeOtherFormValue") %></li> 

<% Html.RenderPartial("AddressForm"); %> 
</ul> 
<%} %> 

기본 모델 바인더는 관련 속성을 해당 뷰 모델에 속성을 뷰 모델의 "주소"라는 개체를 찾아, 그리고 채우는 알고있다.

이것은 과도 할 수 있으며 내 프로젝트에서 양식을 "공유"해야하는 경우를 결코 발견하지 못했지만 위의 내용은 내가 할 것인지를 찾기 시작했을 것입니다.

0

양식이 독립형 인 경우 폼을 단일 컨트롤러에서만 사용할 수 있도록하는 것이 좋습니다. 리디렉션 값이 들어있는 양식에 숨겨진 필드를 추가하십시오. 데이터가 게시되고 컨트롤러가 데이터베이스의 레코드를 업데이트하면 리디렉션 필드의 값을 읽고 다른 컨트롤러로 리디렉션 할 수 있습니다.

내 머리 꼭대기에서 벗어남. 그것은 분명 조금 구체화 할 필요가 :

AddressController :

public ActionResult EditAddressHere(int AddressID) 
{ 
    return RedirectToAction("Edit", "Address", new { id = AddressID, controller = "Controller2", action = "Saved" }); 
} 

public ActionResult Saved() 
{ 
    return View(); 
} 
: 당신이 컨트롤러 2라는 이름의 다른 컨트롤러에서 양식을 사용하고 싶다면

public ActionResult Edit(int id) 
{ 
    return Edit(id, "Address", "Index"); // return to the Index page 
} 

public ActionResult Edit(int id, string controller, sting action) 
{ 
    Address address = MyDatabase.GetAddress(id); 
    ViewData["Action"] = action; 
    ViewData["Controller"] = controller; 
    return View(address); 
} 

public ActionResult Edit(Address address) 
{ 
    MyDatabase.Save(address); 

    // Read redirect from Form 
    string action = Request.Form["Action"]; 
    string controller = Request.Form["Controller"]; 
    return RedirectToAction(action, controller); 
} 

, 당신은 같은 것을 사용하는 것이

보기를 포함시키지 않았지만 컨트롤러 및 작업 데이터를 양식의 숨겨진 필드에 저장할 정도로 간단해야합니다.

관련 문제