2013-03-15 3 views
1

나는 거의 동일한보기 및 편집보기를 가지고 있습니다. 둘 다 계단식 드롭 다운 목록을 포함합니다. 두 번째 목록의 값은 작성 또는 편집중인 데이터의 일부입니다. 첫 번째 드롭 다운은 두 번째 목록의 값에 대한 필터입니다.Ajax 상대 URL을 사용하는 Jquery 게시물

두보기 모두 첫 번째 드롭 다운 목록의 변경 이벤트에 대한 처리기를 첨부하는 동일한 스크립트를 사용합니다. 핸들러는 컨트롤러의 메소드에 대한 포스트를 만듭니다.

작성보기를 실행하고 첫 번째 드롭 다운 목록을 변경하면 올바르게 작동합니다. 두 번째 목록이 업데이트됩니다. 편집보기에서 시도 할 때 500 내부 서버 오류가 발생합니다.

방화범이 들었습니다. 나는 핸들러에 휴식을 취했다. 선택시 두 경우 모두 호출됩니다. 전송 된 데이터는 동일하게 나타납니다 ($ (this) .serialize()는 동일하게 보입니다).
Firebug 콘솔에 다음과 같이 표시됩니다. 필요한 위조 방지 양식 필드 " __RequestVerificationToken "가 없습니다. 이 메소드를 호출해야한다는 것을 알지는 못하지만 물론 다른 메소드 (액션)가 필요합니다.

필자는 어제 전에 방화범을 사용 해 본 적이 없으므로 어떻게 알았는지 확인할 수있는 가능성이 훨씬 더 많습니다. (나는 MVC와 웹 어플리케이션에 대해 완전히 새로운 지식을 가지고있다.)

나는 내 컨트롤러 메소드를 사용하고있다. 생성보기에서만 호출되면 히트됩니다.

필자는 필사적으로 전화 유형을 POST 대신 GET으로 변경해 보았습니다. 그 결과 다른 이름 (HttpGet EDIT)이 호출되는 컨트롤러 메서드가 발생했습니다.

나는 전화하는 방법이 발견되지 않았다는 느낌을받습니다 (편집 중). 그 대신에 다른 방법으로 어떤 시도가 이루어졌으며 (나는 어느 것을 모른다) 그 방법은 위조 방지 토큰이 필요합니다.

편집 : 신선한 공기의 닙 나는 물론 내가 호출되는 어떤 행동을 알고 실현 : 그것은 (AN antiforgery 토큰이 필요한)에 HttpPost 편집 작업입니다. 이것은 정상적인 양식 제출 작업입니다. 디버거에서 빠르게 실행하면이를 확인할 수 있습니다. 이 호출이 현재의 이유로 실패하는 사실은 분명합니다. 그런데 왜이 행동이 전혀 부름을 받았습니까?

업데이트 : 방화 광 콘솔은 다른 작업이 호출되고 있음을 나타냅니다. Create 케이스에서는 .../_ an_alphanumeric_literal_/Order/PopulateAvtalDDL을 원했습니다. 편집 사례에서 .../_ an_alphanumeric_literal_/Order//PopulateAvtalDDL을 편집하십시오. 라우팅 문제입니까? 그렇다면, 나는 아직도 그것을 얻지 못한다. 전화는 모두 동일한 스크립트로 만들어진 나는 오직 하나 개의 경로 (MVC 4 기본적으로 기본 경로) 설정이 있습니다

routes.MapRoute(
      name: "Default", 
      url: "_an_alphanumeric_literal_/{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

업데이트 : 마지막으로 몇 가지 관련 정보를 찾을 : Relative URLs in AJAX requests합니다. 다음 라우팅 문제입니다. 스크립트 URL을 상대 PopulateAvtalDDL에서 절대 /_an_alphanumeric_literal_/Order/PopulateAvtalDDL으로 변경하면 두보기 모두에서 작동합니다. 인용 된 링크의 대답은 경로가 브라우저에서 현재 URL과 관련이 있음을 나타냅니다. 제 경우에는 http://localhost:51852/_an_alphanumeric_literal_/Order/Edit/6?markedOrderId=0http://localhost:51852/_an_alphanumeric_literal_/Order/Create?markedOrderId=0입니다. 상대 URL이 구성되면 마지막 세그먼트가 대체됩니다.작성 사례에서을 작성하고 편집 사례의 경우 (편집 된 데이터의 ID)입니다. 무슨 일이 일어 났는지 이해 해요! 다음

내 솔루션 :

가 (모두보기)에 필터 DDL 주위 사업부를 추가 URL을 설정 : <div id="kundDDL" data-url="@Url.Action("PopulateAvtalDDL", "Order")">. 그런 다음 스크립트에서 해당 URL url: $('#kundDDL').data('url')에 액세스합니다. 여기
@model AssetMgmt.Models.OrderEditVM 
@using AssetMgmt.Models; 

@{ 
    ViewBag.Title = MsgString.LblCreateNew + " order"; 
} 

<h2>@ViewBag.Title</h2> 


@using (Html.BeginForm(null, null, FormMethod.Post)) 
{ 
    @Html.ValidationSummary(true) 
    @Html.AntiForgeryToken() 

    @Html.HiddenFor(m => m.MarkedOrderId) 

    <fieldset> 
     <legend>Filter</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(m => m.KundId) 
     </div> 
     <div class="dropdownlist"> 
      @Html.DropDownListFor(m => m.KundId, Model.KundDropDown, string.Empty) 
     </div> 
     <div class="dropdown-validation-error"> 
      @Html.ValidationMessageFor(model => model.KundId) 
     </div> 
    </fieldset> 

    <fieldset> 
     <legend>Orderdata</legend> 

     <div id="avtalDDL"> 
      @Html.Partial("_AvtalDDL") 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Ordernummer) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Ordernummer) 
      @Html.ValidationMessageFor(model => model.Ordernummer) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Beställare) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Beställare) 
      @Html.ValidationMessageFor(model => model.Beställare) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Orderdatum) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Orderdatum) 
      @Html.ValidationMessageFor(model => model.Orderdatum) 
     </div> 

     <p> 
      <input type="submit" value="@MsgString.LblSave" /> 
     </p> 
    </fieldset> 
} 
<div> 
    @Html.ActionLink(MsgString.LblBack, "Index", new { markedOrderId = Model.MarkedOrderId }) 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    <script type="text/javascript" src="~/Scripts/jquery.maskedinput-1.3.1.min.js"></script> 
    <script type="text/javascript" src="~/Scripts/assetMgmtMasks.js"></script> 
    <script src="~/Scripts/assetMgmtOrderPopulateDDL.js" type="text/javascript"></script> 
} 

편집보기입니다 : 여기

은보기 만들기에 대한 코드의

@model AssetMgmt.Models.OrderEditVM 
@using AssetMgmt.Models; 

@{ 
    ViewBag.Title = MsgString.LblEdit + " order"; 
} 

<h2>@ViewBag.Title</h2> 

@using (Html.BeginForm(null, null, FormMethod.Post)) 
{ 
    @Html.ValidationSummary(true) 
    @Html.AntiForgeryToken() 

    @Html.HiddenFor(model => model.OrderId) 
    @Html.HiddenFor(model => model.Timestamp) 
    @Html.HiddenFor(model => model.MarkedOrderId) 

    <fieldset> 
     <legend>Filter</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(m => m.KundId) 
     </div> 
     <div class="dropdownlist"> 
      @Html.DropDownListFor(m => m.KundId, Model.KundDropDown, string.Empty) 
     </div> 
     <div class="dropdown-validation-error"> 
      @Html.ValidationMessageFor(model => model.KundId) 
     </div> 
    </fieldset> 

    <fieldset> 
     <legend>Orderdata</legend> 

     <div id="avtalDDL"> 
      @Html.Partial("_AvtalDDL") 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Ordernummer) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Ordernummer) 
      @Html.ValidationMessageFor(model => model.Ordernummer) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Beställare) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Beställare) 
      @Html.ValidationMessageFor(model => model.Beställare) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Orderdatum) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Orderdatum) 
      @Html.ValidationMessageFor(model => model.Orderdatum) 
     </div> 

     <p> 
      <input type="submit" value="@MsgString.LblSave" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink(MsgString.LblBack, "Index", new { markedOrderId = Model.MarkedOrderId }) 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    <script type="text/javascript" src="~/Scripts/jquery.maskedinput-1.3.1.min.js"></script> 
    <script type="text/javascript" src="~/Scripts/assetMgmtMasks.js"></script> 
    <script src="~/Scripts/assetMgmtOrderPopulateDDL.js" type="text/javascript"></script> 
} 

스크립트 :

$(document).ready(function() { 
    //Kund select 
    $('#KundId').change(function() { 
     $.ajax({ 
      url: 'PopulateAvtalDDL', 
      type: 'post', 
      data: $(this).serialize(), 
      success: function (result) { 
       $('#avtalDDL').html(result); 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       alert(xhr.status); 
       alert(xhr.statusText); 
       alert(thrownError); 
      } 
     }); 
     return false; 
    }); 
}); 

컨트롤러 메소드의 서명 :

[HttpPost] 
public PartialViewResult PopulateAvtalDDL(int kundId = 0) 

답변

0

마지막으로 AJAX 요청의 상대 URL 몇 가지 관련 정보를 발견했습니다. 이것은 라우팅 문제입니다. 상대적인 PopulateAvtalDDL에서 절대/_an_alphanumeric_literal_/Order/PopulateAvtalDDL로 스크립트 URL을 변경하면 두보기 모두에서 작동합니다. 인용 된 링크의 대답은 경로가 브라우저에서 현재 URL과 관련이 있음을 나타냅니다. 내 경우에는
http://localhost:51852/_an_alphanumeric_literal_/Order/Edit/6?markedOrderId=0

http://localhost:51852/_an_alphanumeric_literal_/Order/Create?markedOrderId=0입니다. 상대 URL이 구성되면 마지막 세그먼트가 대체됩니다. 작성 인 작성 예에서는 편집 사례의 경우 6 (편집 된 데이터의 ID)입니다. 다음

내 솔루션 :

가 (모두보기)에 필터 DDL 주위 사업부를 추가 URL을 설정 :
<div id="kundDDL" data-url="@Url.Action("PopulateAvtalDDL", "Order")">.
그런 다음 스크립트 URL에
url: $('#kundDDL').data('url')을 입력하십시오.