2016-09-21 3 views
0

私のアプリケーションはCRUD契約が必要で、各契約に文書を添付することができます。 MVC5 - Html.Actionを含むビューの転記

  • 1契約に文書を追加する(AddDocument.cshtml)

    • 1契約のプロパティを更新する(Edit.cshtml): だから、私の編集/更新]ページでは、私は三つの形式を持っています は

    (表示するために必要はありません)契約からドキュメントを削除するには、それは次のようになります。

    Edit.cshtml

    @model ContractViewModel 
    @Html.Action("AddDocument", "Contracts", new { id = Model.IdContract }) 
    @Html.Action("RemoveDocument", "Contracts", new { id = Model.IdContract }) 
    @using (Html.BeginForm("Edit", "Contracts", FormMethod.Post, new { @class = "form-horizontal", enctype = "multipart/form-data" })) 
    { 
        @Html.AntiForgeryToken() 
        @Html.ValidationSummary(true) 
        @Html.HiddenFor(model => model.IdContract) 
        <div class="form-group"> 
          @Html.LabelFor(model => model.ContractNumber, htmlAttributes: new { @class = "control-label col-md-4" }) 
          <div class="col-md-8"> 
           @Html.EditorFor(model => model.ContractNumber, new { htmlAttributes = new { @class = "form-control" } }) 
           @Html.ValidationMessageFor(model => model.ContractNumber) 
          </div> 
        </div> [...] 
        <input type="submit" value="Update"/> 
    } 
    

    AddDocument.cshtml

    @model DocumentViewModel 
    @using (Html.BeginForm("AddDocument","Contracts", FormMethod.Post, new { @class = "form-horizontal", enctype="multipart/form-data" })) 
    { 
         @Html.AntiForgeryToken() 
         @Html.HiddenFor(model => model.IdContract) 
         <div class="form-group"> 
          @Html.LabelFor(model => model.DocHttp, htmlAttributes: new { @class = "control-label col-md-2" }) 
          <div class="col-md-10"> 
            @Html.TextBoxFor(x => x.DocHttp, htmlAttributes: new { @class = "form-control", data_style = "btn-primary", type = "file", multiple = "multiple" }) 
            @Html.ValidationMessageFor(model => model.DocHttp) 
          </div> 
         </div> 
         <input type="submit" value="Add"/> 
    } 
    

    ContractController.csまず

    public ActionResult Edit(int? id) 
    { 
        if (id == null) 
        { 
         throw new HttpException(400, "Bad request"); 
        } 
        Contract contract = business.Get<Contract>(x => x.IdContract == id); 
        ContractViewModel vm = new ContractViewModel(contract); 
        if (contract == null) 
        { 
         throw new HttpException(404, "Not found"); 
        }    
        return View(vm); 
    } 
    
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(ContractViewModel vm) 
    { 
        Contract contract = business.Get<Contract>(x => x.IdContract == id); 
        if (ModelState.IsValid) 
        { 
         [...] 
        } 
        return View(vm); 
    } 
    
    public ActionResult AddDocument(int id) 
    { 
        DocumentViewModel vm = new DocumentViewModel(); 
        vm.IdContract = id; 
        return PartialView(vm); 
    } 
    
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult AddDocument(DocumentViewModel vm) 
    { 
        Contract contract = business.Get<Contract>(x => x.IdContract == vm.IdContract);    
        if (ModelState.IsValid) 
        { 
         [...] 
        } 
        return RedirectToAction("Edit", "Contracts", new { id = vm.IdContract }); 
        //return View(vm); 
    } 
    

    私が編集フォームを送信するとき、問題は、[HttpPost]編集方法は当然、と呼ばれているが、 [HttpPost] AddDocumentも参照してください。 Html.RenderPartialの代わりにHtml.Actionが使用されているのでしょうか?

    私が正しいとすれば、Html.RenderPartialがパラメータを渡している間に、部分ビューを生成する前に処理を行う必要があるときに、Html.Actionが呼び出されます。

    なぜ[HttpPost] AddDocumentメソッドが呼び出されますか?誰がそれを呼びましたか?

    第2に、問題を回避するには、Viewメソッドを呼び出す代わりに[編集]ページにリダイレクトする必要があります。しかし、私は入力されたデータを失っています。この問題をどうやって管理できますか?

    ありがとうございました。

  • 答えて

    0

    [...]だけでなく、[HttpPost] AddDocumentもあります。 Html.RenderPartialの代わりにHtml.Actionが使用されているのでしょうか?

    ビュー内に複数のフォームを配置することができます。各フォームは、対応するコントローラメソッドのみを呼び出します。

    もし私が正しいのであれば、Html.RenderPartialがパラメータを渡している間に、部分ビューを生成する前に処理を行う必要があるときに、Html.Actionが呼び出されます。

    あなたは、コントローラのコールなしでHTMLをインポートしている@ html.Partialを呼び出すときに、基本的にこのpost

    を確認してください。その部分ビューが強く型付けされている場合は、呼び出しを行っているビューの現在のモデルがその部分に必要なモデルを持っていることを確認する必要があります。あなたは、呼び出し元のビューモデルからdiferentモデルを持っている部分図を持っているので

    は、次の2つの選択肢があります:あなたのソリューションとして

    の1-同じ、アクションメソッドを呼び出すと、そのビューにモデルを作成し

    2 @ Html.renderPartialまたは@ Html.Partialを呼び出すビューに渡すモデルは、必要なモデルを部分的に含める必要があります。 使用例@Html.Partial("SomePartialview",Model.thePartialViewModel)

    は第二に、問題を回避するために、私は、ビューのメソッドを呼び出すのではなく、編集ページにリダイレクトする必要があります。しかし、私は入力されたデータを失っています。この問題をどうやって管理できますか?

    データはリダイレクト間で保持されません。

    あなたはthisを行い、および/またはthis

    +0

    感謝を読むが、あなたの答えは私を助けていない可能性があります。私は3つのHttpPostメソッドが(Edit、AddDocument、RemoveDocument)と呼ばれる理由を知りたかったのですが、Editメソッドだけを呼び出すはずでした。 – madhatterx

    +0

    新しく作成したプロジェクトで問題を再現できませんでした。たぶん一部のカウリーブレースが外れていますか? – Kharlos

    関連する問題