나는 거의 동일한보기 및 편집보기를 가지고 있습니다. 둘 다 계단식 드롭 다운 목록을 포함합니다. 두 번째 목록의 값은 작성 또는 편집중인 데이터의 일부입니다. 첫 번째 드롭 다운은 두 번째 목록의 값에 대한 필터입니다.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=0
과 http://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)