2010-04-28 3 views
1

나는 다음과 같은 데이터보기가 :Modelbinding 2

public class ShoppingCartViewData 
{ 
    public IList<IShoppingCartItem> Cart 
    { 
     get; 
     set; 
    } 
} 

내 컨트롤러에서을 ViewData 채울 :

viewData.Cart = CurrentSession.CartItems; 

return View(viewData); 

을 그리고보기와 디스플레이로 데이터를 전송을 그것을 사용 :

<% for (int i = 0; i < Model.Cart.Count; i++) { %> 
<%= Html.TextBoxFor(m => m.Cart[i].Quantity)%> 
    <%= Html.HiddenFor(m => m.Cart[i].Id) %> 
<% } %> 

나는 게시물에 대한 viewdata 잡을 수 있기를 원한다. 내가하려고하면 : System.MissingMethodException :

[HttpPost] 
public ActionResult UpdateCart(ShoppingCartViewData viewData) 
{ 
    ... 
} 

내가 이것을 실행하면 내가 얻을 인터페이스의 인스턴스를 만들 수 없습니다.

누구든지 이에 대해 밝힐 수 있습니까? 이 기능을 사용하려면 무엇을해야합니까?

많은 감사합니다.

+0

구체적인 구현보다는 IShoppingCartItem에 대한 인터페이스를 사용하는 이유는 무엇입니까? – UpTheCreek

+0

해결책을 찾았습니까? – GLeBaTi

답변

1

formcollection을 매개 변수로 추가 할 수 있습니다. 그리고 데이터를 사용중인 뷰 모델로 보지 않을까요? 이 정확한 솔루션 인 경우

[HttpPost] 
public ActionResult UpdateCart(ShoppingCartViewModel viewModel, FormCollection collection) 
{ 
    ... 
} 

확실하지, 내가 학습 MVC2.0 바쁜도있어 및 .NET4 ;-)

난 당신의 뷰 모델에 대한 모델 바인더를 만들 것, 그리고 당신이 할 수있는
+0

이것이 문제를 해결할 것이라고 생각하지 않습니다. 데이터 바인더가 구체적인 구현없이 인터페이스가 포함 된 ShoppingCartViewData를 인스턴스화하려고하기 때문입니다. – UpTheCreek

+0

주위에 방법이 있습니까? ShoppingCartViewData에 객체를 삽입해야합니까? – Thomas

+0

어쨌든 여기서 인터페이스를 사용하고 계십니까? – UpTheCreek

0

메소드 매개 변수에 바인드 할 때 적절한 인터페이스를 구현하는 구체 유형을 인스턴스화하십시오.

논리를 모델 바인더에 삽입하여 양식 필드를 적절하게 읽고 올바른 IList 또는 IShoppingCartItem 데이터를 인스턴스화 할 수 있으므로 인터페이스의 단일 구현에 고정 할 필요가 없습니다.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Administration.Master" Inherits="System.Web.Mvc.ViewPage<ShoppingCartViewData>" %> 

나이 : 또한

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Administration.Master" Inherits="System.Web.Mvc.ViewPage<List<IShoppingCartItem>>" %> 

// you don't need this 
// viewData.Cart = CurrentSession.CartItems; 

// return View(viewData); 

// do it like this 
return View(CurrentSession.CartItems); 

는 그런 강력한 형식의보기 중이 있습니다

+0

예제가 있습니까? 사용자 지정 바인더 IList 대신 IList 전달하고 값을 채우는 방법을 찾고 있어요. 어디서나 그 예를 찾을 수 없습니다. – Thomas

+0

이것은 좋은 리소스처럼 보입니다. http://dotnet.dzone.com/news/custom-aspnet-mvc-model-binder - 기본적으로 인터페이스 유형을 맞춤형 모델 바인더로 등록하기 만하면됩니다. 사용할 객체, 메소드에 전달할 올바른 유형을 구현하는지 확인하십시오. – Tejs

0

내 두 의견을 감안할 때 이것은 내가 어떻게 할 것입니다 이 코드는 작동하지 않습니다. 이렇게하면 동일한 이름과 ID를 가진 많은 텍스트 상자가 생성됩니다. 개수가 포함 된 텍스트 상자를 생성해야하므로 Html.TextBoxFor()를 사용할 수 없습니다. Html.TextBox()로 되돌리거나 TextBoxFor() 메서드를 새로 작성하여 숫자를 받아 들여야합니다.

+0

하지만 실제로 ShoppingCartViewData 클래스의 이름을 ShoppingCartViewModel로 변경하십시오. – mare

0

<% for (int i = 0; i < Model.Cart.Count; i++) { %> 
<%= Html.TextBoxFor(m => m.Cart[i].Quantity)%> // this won't work, if you want to post back all textboxes after they are edited 
    <%= Html.HiddenFor(m => m.Cart[i].Id) %> 
<% } %> 

HTH는 I는 동작 방법에 '내부'매개 변수를 추가 한 후 동일한 예외를 얻었다.

컨트롤러 생성자에 중단 점을 추가하여 폼의 인수 뒤에 지정된 동작 메서드 중 하나가 대신 호출되고 있음을 발견했습니다.