2012-03-06 4 views
3

배경 : 나는 3 개 부분 지문이있는 ASP.NET MVC 응용 프로그램 작업입니다수 없습니다

(면도기 엔진을 기반으로) 메인 페이지에. 첫 번째 부분에는 사용자가 채우는 검색 조건 목록이 있습니다. 두 번째 부분은 전달 된 데이터를 기반으로 ParameterParts 목록을 표시합니다. 세 번째 부분은 전달 된 데이터를 기반으로 사양 목록을 표시합니다. 내 두 번째 및 세 번째 부분보기를 채우기 위해 컨트롤러에서 메서드를 호출해야합니다.

문제 :

  • PartialView 반환 오류 조건에 맞게 AJAX 호출이 발생합니다.
  • void를 반환하면 성공 조건과 일치하지만 parameterResults를 채울 내용이 없습니다.
  • json을 반환하면 성공 조건과 일치하지만 내 부분보기에서는 아무 것도 렌더링하지 않습니다.
  • 내 partialview를 문자열로 변환하고 json (http://www.tugberkugurlu.com/archive/working-with-jquery-ajax-api-on-asp-net-mvc-3-0-power-of-json-jquery-and-asp-net-mvc-partial-views)으로 반환 할 수 있다면 작동하는 것으로 보이지만 회사 방화벽으로 인해 Nuget을 사용하여 라이브러리를 다운로드해야합니다. 모든 세 개의 부분 지문 첫 부분에 대한

    <div class="prepend-top span-24 last" id="searchPage"> 
        <div class="span-24 last"> 
         @Html.Partial("_Search") 
        </div> 
        <div class="span-24 last" id="parameterResults"> 
         @Html.Partial("_ParameterParts") 
        </div> 
        <div class="span-24 last" id="searchSpecResults"> 
         @Html.Partial("_Specifications") 
        </div> 
    </div> 
    

    코드의 상위보기 (index.cshtml)에 대한

코드 (_Search.cshtml) :

// Post the object to the server using jQuery 
$.ajax({ 
    url: '@Url.Action("ParameterParts")', 
    type: 'POST', 
    dataType: 'html', 
    data: dataToPass, 
    error: function (data) { alert('Something Went Wrong'); }, 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert('Success P'); 
     $("parameterResults").html(data); 
    } 
}); 

이 코드는 dataToPass 매개 변수를 사용하여 ParameterParts 메서드를 올바르게 호출합니다. 그대로 내가 3 부분을 포함하고 있지 않다

@model IEnumerable<SmartPlex.Web.SmartPlex.ODataService.ParameterPart> 

<table> 
    <tr> 
     <th> 
      Part Number 
     </th> 
     <th> 
      Description 
     </th> 
    </tr> 
    @if (Model != null) 
    { 
     foreach (var item in Model) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => item.PartNumber) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Description) 
       </td> 

      </tr> 
     }      
    } 
</table> 

: 2 부분에 대한

[HttpPost] 
public ActionResult ParameterParts(CriteriaViewModel vm) 
{ 
    List<ParameterPart> parameterParts = new List<ParameterPart>(); 

    //Some logic to populate parameterParts using the passed in object 

    return PartialView("_ParameterParts", parameterParts); 
} 

코드 : 여기

은 내가 컨트롤러 방법을 위해 사용하고 코드입니다 두 번째와 동일합니다. 위 방법을 사용하여 부분 데이터를 어떻게 업데이트 할 수 있습니까?

답변

5
dataType: 'dataToPass', 
data: json, 

데이터 형식 다시 서버에서 기대되는 데이터 유형입니다. html을 반환하는 경우에는 json이 아니어야합니다.

데이터는 서버로 보낼 데이터입니다.

업데이트 :

선택 번호가 잘못되었습니다.당신의 HTML이있는 경우 :

<div class="span-24 last" id="parameterResults"> 
    @Html.Partial("_ParameterParts") 
</div> 

당신의 코드는 다음과 같아야합니다

$("#parameterResults").html(data); 
+0

감사합니다. BZ 정보입니다. HTML을 다시 기대하는 내 아약스 호출을 수정 한 후 반환되는 데이터를 경고하면 적절한 HTML을 얻습니다. 그러나 여전히 $ ("parameterResults") div 안에 html을 렌더링 할 수 없습니다. $ ("parameterResults") .html (data)이 아무 것도하지 않는 것 같습니다. – Yasir

+0

@B Z, 도움이된다면 주보기와 두 번째 부분 코드도 추가했습니다. – Yasir

+0

예 ... 선택기가 잘못되었습니다. 내가 혼자서 그것을 발견 할 수 없다는 것을 믿을 수 없다. 엄청 고마워. – Yasir

1

당신이 문자열 부분 뷰를 렌더링하기 위해 별도의 라이브러리를 필요 없어요. 이 같은 확장 메서드를 만들 :

public static class RazorViewToString 
{ 
    public static string RenderRazorViewToString(this Controller controller, string viewName, object model) 
    { 
     if (controller==null) 
     { 
      throw new ArgumentNullException("controller", "Extension method called on a null controller"); 
     } 

     if (controller.ControllerContext==null) 
     { 
      return string.Empty; 
     } 

     controller.ViewData.Model = model; 
     using (var sw = new StringWriter()) 
     { 
      var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); 
      var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View); 
      return sw.GetStringBuilder().ToString(); 
     } 
    } 

} 

다음 컨트롤러 내부 클라이언트의 JQuery와 아약스 성공 콜백에 다음

return new JsonResult {Data = this.RenderRazorViewToString("partialViewName", model)}; 

, 단순한 APPEND로 사용할 수 있습니다 귀하의 DOM에 반환 된 데이터

http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

+0

감사합니다. @labroo, 이것은 내가 필요한 html을 제공합니다. 그러나 html을 렌더링 할 수 없습니다. 즉 DOM에 반환 된 데이터를 추가 할 수 없습니다. 어떻게해야합니까? – Yasir

+0

@labroo 덕분에 솔루션이 완벽하게 작동합니다. 그러나 올바른 답으로 하나의 응답 만 표시 할 수 있기 때문에 그의 접근 방식이보다 직관적이므로 @B Z로 가야합니다. – Yasir