2011-09-12 3 views
2

모델이 컨트롤러로 전달되는 Ajax.BeginForm (전송 버튼 포함)을 사용할 때 알아 챘지만 Ajax.ActionLink를 사용할 때는 그렇지 않습니다. 통과했다 - 또는, 최소한 나는 그것을 두드리는 방법을 발견하지 못했다.ASP.NET MVC - Ajax.BeginForm vs Ajax.ActionLink

첫 번째 질문 : 어느 것이 더 좋은 경로인지 어떻게 결정합니까?

이제는 하나의 예제 시나리오를 조금 더 깊이 들어 보겠습니다. 몇 가지 간단한 데이터 형식 속성과 몇 가지 List 속성이있는 모델이 있습니다. Create/Edit View는 Html.BeginForm()으로 렌더링됩니다. 제출 버튼은 전체 뷰 모델을 반환합니다. 그러면 DB 모델을 통해 모든 데이터를 DB에 저장할 수 있습니다. 내가 말했던 것처럼 나는 약간의 목록 조각도 가지고있다. 예를 들어 일련의 확인란으로 렌더링하는 신용 ​​카드 목록을 허용하고 제공되는 서비스 목록을 확인란 목록으로 렌더링했습니다. 이 모든 것은 Form Post에서 처리하기 쉽습니다. 그러나 기본적으로 자유형 텍스트 항목 인 하나의 목록이 있으며 추가 단추가있는 텍스트 상자와 삭제 단추가있는 모든 목록 항목이 필요합니다.

는/편집보기 만들기 내 일처럼 보인다 : 부분보기 보이는

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<RainWorx.FrameWorx.MVC.ViewModels.DirectoryEdit>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
    <div class="Column12"> 
     <div class="Shadow"></div> 
     <h2 class="h2row"><%= Model.PageTitle%></h2> 
     </div> 
    <% using (Html.BeginForm()) 
     {%> 
     <%: Html.ValidationSummary(true)%> 

     <fieldset> 
      <%--<legend>Fields</legend>--%> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.Name)%> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.Name, new { style = "width:20em;" })%> 
       <%: Html.ValidationMessageFor(model => model.Name)%> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.Address1)%> 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.Address1, new { style = "width:20em;" })%> 
       <%: Html.ValidationMessageFor(model => model.Address1)%> 
      </div> 
...     

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.LookupAccepts)%> 
      </div> 
      <div class="editor-field"> 
       <hr /> 
       <% foreach (var a in Model.MyAccepts) 
        { 
         if (a.Checked) 
         { %> 
         <input type="checkbox" name="AcceptIDs" checked="checked" value="<%: a.ID %>" /> <%: a.Name%><br /> 
        <% } 
         else 
         { %>      
         <input type="checkbox" name="AcceptIDs" value="<%: a.ID %>" /> <%: a.Name%><br /> 
       <% } 
        } %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.LookupServices)%> 
      </div> 
      <div class="editor-field"> 
       <hr /> 
       <% foreach (var a in Model.MyServices) 
        { 
         if (a.Checked) 
         { %> 
         <input type="checkbox" name="ServiceIDs" checked="checked" value="<%: a.ID %>" /> <%: a.Name%><br /> 
        <% } 
         else 
         { %>      
         <input type="checkbox" name="ServiceIDs" value="<%: a.ID %>" /> <%: a.Name%><br /> 
       <% } 
        } %> 
      </div> 

      <div class="editor-label"> 
       <%: Html.LabelFor(model => model.MyLicenses)%> 
      </div> 
      <div class="editor-field"> 
       <hr /> 
       <% Html.RenderPartial("EditLicense", model: Model); %> 
      </div> 

      <div class="editor-label"> 
       &nbsp; 
      </div> 
      <div class="editor-field"> 
       <input type="submit" value="Save" /> 
      </div> 
     </fieldset> 

    <% } %> 
    </div> 

    <div> 
     <%: Html.ActionLink("Back to List", "Index")%> 
    </div> 

</asp:Content> 

같은 : 제어 언어 = "C#을"상속 = "System.Web.Mvc.ViewUserControl"@

<% %> <% @ 오기 스페이스 = "RainWorx.FrameWorx.MVC"%>

<%의 foreach는 (Model.MyLicenses에서 VAR 라이센스) {%>

<%} %>

이 방법을 설정하기위한 내 생각의 기차 꽤 똑바르다 (나는 그것이 어떻게해서든지있다라고 생각한다). 라이센스 섹션에서 아약스에게 뭔가가 있습니다. 주 모델에 대한 모든 정보를 잃지 않고 한 문자열을 추가하고 싶습니다. 그리고 추가가 완료되면 부분 뷰를 업데이트 된 List로 업데이트하려고합니다.

레이아웃 한 것보다 더 나은 방법이있을 수 있습니다. 그렇다면 레이아웃 해주세요. 지금 당장 (그리고 빨리) 파악하려고하는 주요 부분은 Ajax.ActionLink (및 내 확장 메소드)가 올바른 방향인지 여부입니다.

답변

1

Ajax.BeginForm은 지정된 양식을 단순히 ajaxify하고 제출할 때 포함 된 모든 입력 필드의 값이 서버로 전송됩니다. 일반적인 양식과 유일한 차이점은 AJAX를 사용하여 전송된다는 것입니다.

한편 Ajax.ActionLink는 주어진 URL에 대한 AJAX 요청을 수행하는 간단한 앵커 태그를 생성합니다. 지정하지 않으면 서버에 추가 값을 보내지 않습니다.

걸릴 더 나은 경로를 어떻게 결정합니까?

개인적으로 나는 그것들을 사용하지 않습니다. 표준 Html.BeginForm 및 Html.ActionLink를 사용하고 수동으로 코드를 작성하여 jQuery와 조심스럽게 AJAXify하십시오 (물론 Ajax를 사용해야하는 경우).

동적 목록 편집을 구현하는 시나리오에 대해서는 following blog post을 살펴보십시오.

+1

도우미 방식 대신 수동으로 수행하는 예가 있습니까? 헬퍼를 사용하는 것을 좋아하지 않는 이유는 무엇입니까? – Ciwan

관련 문제