2016-09-06 4 views
0

私はフォームを持つ部分的なビューを持っています - 私はこの部分をホームコントローラから起動します。modalの部分表示からrouteprefix属性を持つ別のコントローラへのポストフォーム

@using (Html.BeginForm("CloudContent","Files", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div id="container"></div> 
    <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
    @Html.HiddenFor(m => m.MyProperty); 
    @Html.HiddenFor(m => m.SelectedIds); 
} 

しかし私は、ファイルコントローラは、ルートプレフィックスあり、ファイルコントローラにこのフォームを投稿したい: [RoutePrefix("sth/api/v1/files")]

私のフォームアクションが空であることになります。

名前付きルートには追加されていないようですので、私はbeginrouteformを使用できません。

[HttpPost] 
[Route("getcloudcontent")] 
public List<ConnectedFile> CloudContent(CloudFilesModel model) 
{ 
    //do magic 
} 
+0

htmlヘルパーを使用する代わりに、自分でhtmlを書くことができます。ヘルパーは、あなたが望むものであれば素晴らしいですが、あなたが何をしているのかからまったく逸脱すれば、痛みを伴うことがあります。別のオプションは、カスタムヘルパーを書くことです。これが1オフの場合、それは価値がない。 – nurdyguy

+0

その他のオプションには、RouteConfig.cs(ick)に独自のルートを記述するか、またはファイルコントローラ内のメソッドにルート属性を追加することが含まれます。あなたが明示的にフォームルートを書くことはあなたの最善の策ですが、それらにアクセスできない場合。 – nurdyguy

+0

@nurdyguy - ファイルコントローラのメソッドにルート属性を追加することができます - 私は実際には[[Route( "getcloudcontent")] 'を持っていますが、プレフィックスはまだ重要ですか? – Bartosz

答えて

1

UPDATE:

私は、ファイルコントローラ内に投稿したい方法...また、私は、アプリケーションの上にほとんど影響を与えないので、それは最高の自分のフォームまたは部分図で扱っています:ここで

は、部分的なビュー/子アクションを含む別の例である:

HomeController.cs:

using System.Web.Mvc; 

public class HomeController : Controller 
{ 
    [Route("~/")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [Route("ModalContent")] 
    [ChildActionOnly] 
    public ActionResult ModalContent() 
    { 
     return View(); 
    } 
} 

FilesController.cs:ホーム\ ModalContent.cshtml \

<!DOCTYPE html> 
<html> 
<head> 
    <title>Test</title> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
</head> 
<body> 
    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal"> 
     Show modal 
    </button> 

    <div class="modal fade" id="myModal" tabindex="-1"> 
     <div class="modal-dialog"> 
      <div class="modal-content"> 
       <div class="modal-body"> 
        @Html.Action("ModalContent") 
       </div> 
      </div> 
     </div> 
    </div> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
</body> 
</html> 

再生回数::ホーム\ Index.cshtml \

using System.Web.Mvc; 

[RoutePrefix("sth/api/v1/files")] 
public class FilesController : Controller 
{ 
    [HttpPost] 
    [Route("getcloudcontent")] 
    public ActionResult CloudContent(string model) 
    { 
     return Content("test"); 
    } 
} 

ビュー

@using (Html.BeginForm("CloudContent", "Files", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div id="container"></div> 
    <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
} 

Global.asax.cs:

using System.Web.Mvc; 
using System.Web.Routing; 

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     RouteTable.Routes.MapMvcAttributeRoutes(); 
    } 
} 

と結果HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Test</title> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
</head> 
<body> 
    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal"> 
     Show modal 
    </button> 

    <div class="modal fade" id="myModal" tabindex="-1"> 
     <div class="modal-dialog"> 
      <div class="modal-content"> 
       <div class="modal-body"> 
        <form action="/sth/api/v1/files/getcloudcontent" enctype="multipart/form-data" method="post"> 
         <div id="container"></div> 
         <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
        </form> 
       </div> 
      </div> 
     </div> 
    </div> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
</body> 
</html> 

あなたのコードに問題がある別の何かがあります。私はあなたのコードを実行し、それは何の問題もなく働いた。

FilesController.cs:

using System.Web.Mvc; 

namespace Controllers 
{ 
    [RoutePrefix("sth/api/v1/files")] 
    public class FilesController : Controller 
    { 
     [Route("")] 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost] 
     [Route("getcloudcontent")] 
     public ActionResult CloudContent(string model) 
     { 
      return Content("test"); 
     } 
    } 
} 

Index.cshtml:

@using (Html.BeginForm("CloudContent", "Files", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div id="container"></div> 
    <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
} 

のGlobal.asaxここ

コードです。CS:

using System.Web.Mvc; 
using System.Web.Routing; 

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     RouteTable.Routes.MapMvcAttributeRoutes(); 
    } 
} 

私は、次のHTML参照http://localhost/sth/api/v1/filesに行くとき:

<!DOCTYPE html> 
<html> 
<head><title>Test</title></head> 
<body> 
    <form action="/sth/api/v1/files/getcloudcontent" enctype="multipart/form-data" method="post"> <div id="container"></div> 
    <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
</form> 
</body> 
</html> 

お知らせアクションは接頭辞が含まれて正しいURLを持って形成します。

+0

部分図でテスト済みです。同様に動作します。 –

+0

ありがとうございます - 私のPartialViewは、いくつかのホームコントローラのアクションから返され、ブートストラップモーダルとして表示されますか? – Bartosz

+0

'@ Html.Partial(partialViewName)'呼び出しの結果として部分的な部分がサーバ側でレンダリングされるので、それらはどこでレンダリングされるのかを「知らない」ので、そうではありません。しかし、あなたのコメントに基づいて「部分的なビューがコントローラーのアクションから返されました」というのはあなたが子供のアクションを意味していたと思いますが、これは若干異なります。私の答えを別の例で更新しましょう。 –

関連する問題