2016-09-07 9 views
1

私はいくつかのアクションを含むMVCコントローラを持っています。 1つのアクションはレートを変更する責任があります。もう1つはファイルをアップロードする責任があります。 私はそれらを再生すると、アクションが正しく機能します。しかし、ファイルをアップロードするとすぐに、レートを変更しようとすると、ポスト・アクションは失敗します。なぜなら、ポスト・アクションは失敗します。ここにコードがあります。ここ は、ビューの私のコードです: ファイルアップロード後にコントローラのアクションに投稿しようとするとコントローラ名が失われる

変化率:

<form method="post" action="@Url.Action("UploadPreparedContract")"> 
    @Html.Hidden("userApplicationId", Model.UserApplicationId) 
    <div class="upload-section k-content"> 
     @Html.Kendo().Upload().Name("files") 
     <input type="submit" value="Submit"/> 
    </div> 
</form> 

<script type="text/javascript"> 
jQuery(function($) { 
    var viewModel = kendo.observable({ 
     currentDisclosedRate: "@Model.CurrentDisclosedRate",    
     changeRate: function(e) { 
      e.preventDefault(); 
      var self = this; 

      var rawValue = $('#newDisclosureRate').val(); 
      var rate = parseFloat(rawValue); 
      $.ajax({ 
       type: "POST", 
       url: 'ChangeDisclosureRate', 
       data: { newRate: rate, userApplicationId: @Model.UserApplicationId}, 
      }).done(function(result) { 
       Notification.success('Rate changed'); 
       self.set("currentDisclosedRate", rawValue); 
      }) 
      .fail(function(err) { 
       Notification.error('Not changed. Customer may have placed order'); 
      });     
     }, 
    }); 

    kendo.bind($("#page"), viewModel); 
}); 

、ここでは、コントローラ

public class ContractPreparationController : Controller 
{ 
    // GET: Application/ContractPreparation 
    public ActionResult Index(int userApplicationId) 
    { 
     // logic to prepare model  
     return View(new ContractPreparationOutputModel() 
     { 
      // Model properties 
     }); 
    } 

    [HttpPost] 
    public async Task<ActionResult> ChangeDisclosureRate(decimal newRate, int userApplicationId) 
    { 
     return await Command.ApplyAsync(new ChangeDisclosureRateCommand() {UserApplicationId = userApplicationId, NewDisclosureRate = BasisPoint.Percent(newRate) }) == Command.CommandResult.Succeeded 
      ? new HttpStatusCodeResult(HttpStatusCode.OK) 
      : new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 

    [HttpPost] 
    public async Task<ActionResult> UploadPreparedContract(IEnumerable<HttpPostedFileBase> files, int userApplicationId) 
    { 
     if (files == null) 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     if (files.Count() != 1) 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "You must upload one file only"); 
     var application = applicationRepository.GetUserApplication(userApplicationId); 
     if (application == null) 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Invalid user"); 

     var file = files.Single(); 
     var memberDocument = new MemberDocument(blobService, application.FK_UserId); 
     await memberDocument.Uploadfile(file); 

     if (await Command.ApplyAsync(new UploadPreparedContractCommand() {FileGuid = memberDocument.FileGuid , UserApplicationId = userApplicationId, FileExtension = memberDocument.FileExtension}) == Command.CommandResult.Succeeded) 
     { 
      return RedirectToAction("Index", new {userApplicationId}); 
     } 
     return new HttpStatusCodeResult(HttpStatusCode.InternalServerError); // No expected failure case 
    } 
} 

答えて

1

Url.Actionヘルパーメソッドを使用して、アクションメソッドに対する正しい相対URLを生成します。かみそりは、あなたのビューのコードを実行すると

url: '@Url.Action("ChangeDisclosureRate","ContractPreparation")', 

、それはUrl.Action方法および出力(必要に応じてコントローラ名を持つことになります)正しいURLを実行します。ページのソースを表示している場合は、それを見ることができます。

+1

素晴らしい:)それは働いた:) – Maryam

+0

@ Shyju ..なぜ私は@ url.Action( "")ajax要求で言及する必要があります。これの背後にあるロジックは何かを説明することができます – MukulSharma

+0

Url.Actionヘルパーメソッドは、(ルート定義に基づいて)正しい相対パスを指定されたアクションメソッドに返します。 jsコードでハードコーディングするよりも、この方法を使用する方が安全です。 – Shyju

0

があなたのAJAX URLパラメータにコントローラ名を追加してみてくださいです:

url: 'ContractPreparation/ChangeDisclosureRate' 

それ以外の場合、MVCは使用するコントローラを認識しません。

+0

これを試しました。私がこれを行うと、上記のケースではうまくいくが、ファイルをアップロードしていないと問題が発生する。それは 'ContractPreparation/ContractPreparation/ChangeDisclosureRate'に投稿しようとします:( – Maryam

関連する問題