2012-11-17 10 views
1

이 문제에 대한 적절한 해결책을 찾을 수 없습니다.확장 메서드를 동적으로 디스패치 할 수 없습니다. 오류 - 어떻게 해결합니까?

별도의보기가있는 "마법사"를 사용하기 위해 [Serializable] (MVC3 Futures)을 사용하고 있습니다.

public ActionResult Confirm(string backButton, string nextButton) 
     { 
      if (backButton != null) 
       return RedirectToAction("Details"); 

      else if ((nextButton != null) && ModelState.IsValid) 
       return RedirectToAction("Submitted"); 
      else 
       return View(myData); 
     } 
: - (코드 다음 다시 버튼의 문자열 마법사를 통해가는 스 니펫을)

나는 같은 것을 할 내 컨트롤러에 따라 추가
private MyViewModel myData; 
     protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var serialized = Request.Form["myData"]; 
      if (serialized != null) //Form was posted containing serialized data 
      { 
       myData = (MyViewModel)new MvcSerializer().Deserialize(serialized, SerializationMode.Signed); 
       TryUpdateModel(myData); 
      } 
      else 
       myData = (MyViewModel)TempData["myData"] ?? new MyViewModel(); 
      TempData.Keep(); 
     } 
     protected override void OnResultExecuted(ResultExecutedContext filterContext) 
     { 
      if (filterContext.Result is RedirectToRouteResult) 
       TempData["myData"] = myData; 
     } 

가 : 여기 내 컨트롤러의 코드가 직렬화하는 것입니다

@using (Html.BeginFormAntiForgeryPost()) 
    { 
     @Html.Hidden("myData", new MvcSerializer().Serialize(Model, SerializationMode.Signed)) 
    ... 
     @Html.TextBoxFor(m => model.Step.EMail) 
    ... 
    } 

내가 역학을 사용하고 있기 때문에, 내가 대신보기에서 변수를 사용해야합니다 : : 내 .cshtml보기에서

,이이

위의 @Html.TextBoxFor을 수행하기 위해
var model = (MyViewModel) Model.myData; 

그리고 여기에 내 질문이 있습니다. 왜냐하면 내가 대신 @model MyViewModel을 수행한다면, 나는 할 수 없기 때문입니다. model.Step.EMail. 그러나 때문에 역학의 @Html.Hidden이 작동하지 않습니다와 나는 다음과 같은 오류가 발생합니다 :

Compiler Error Message: CS1973: 'System.Web.Mvc.HtmlHelper' has no applicable method named 'Hidden' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.

내가 [Serializable]없이이 일을 다른 방법으로 전환 할 수 있습니다,하지만 내가 코드를 많이 변환 할 수 있습니다. 이 일을 할 수있는 방법이 있습니까?

답변

4

당신은 확장 메서드 구문없이 확장 메서드를 호출

@(InputExtensions.Hidden(Html, "myData", new MvcSerializer().Serialize(Model, SerializationMode.Signed))) 

대신 @Html.Hidden(...) 호출 할 수 있습니다.

+0

감사합니다. 구문을 올바르게 이해하지 못했습니다. – REMESQ

5

데이터 형식이 일치하지 않기 때문에 확장 메서드가 메서드를 식별하지 않습니다. 객체로 캐스트를 시도하십시오. 그것은 작품을 것이다

@Html.Hidden("myData", (Object)new MvcSerializer().Serialize(Model, SerializationMode.Signed)) 

@Html.Hidden("myData", new MvcSerializer().Serialize(Model, SerializationMode.Signed) as Object) 

또는

.

관련 문제