2009-04-08 27 views
4

IDを割り当てられたフォームを持つ部分ビューを作成するにはどうすればよいですか?ASP.NET MVCの部分ビューとフォームのアクション名

using (Html.BeginForm(?action?,"Candidate",FormMethod.Post,new {id="blah"})) 

パーシャルビューの両方作成と編集が非常に最初のパラメータ?action?が異なることになるために使用されます。 私は限りです。私は?action?のどんな価値があるか分かりません。


UPDATE:

は、私は推測する私は質問で十分に明確ではありませんでした。私がやってしまったことは、コントローラ名とアクション名を取得するためにRequest.RawUrlを分割されます。醜いの

string[] actionUrlParts = ViewContext.HttpContext.Request.RawUrl.Split('/'); 
using (Html.BeginForm(actionUrlParts.Length >= 2? actionUrlParts[2] : "", 
     actionUrlParts.Length >= 1 ? actionUrlParts[1] : "", FormMethod.Post, new { id = "blah" })) 

種類をそれが動作します。部分ビューの中にアクション名を付けるより良い方法はありますか?

答えて

7

ViewData経由で実行するアクションを渡します。

ビューをレンダリングするアクションで、ポストバックアクションのViewDataアイテムを作成します。フォーム内で、このViewData項目を参照して、アクションパラメータを入力します。また、アクションと実際のモデルをプロパティとして含むビューのみのモデルを作成し、そこから参照することもできます。

例使用してViewDataを:

using (Html.BeginForm((string)ViewData["PostBackAction"], "Candidate", ... 

レンダリングアクション:

public ActionResult Create() 
{ 
    var model = new UpdateModel { Action = "New" }; 

    ... 

    return View(model); 
} 


public ActionResult Edit(int id) 
{ 
    var model = new UpdateModel { Action = "Update" }; 

    model.CandidateModel = ...find corresponding model from id... 

    return View(model); 
} 
:モデル

public class UpdateModel 
{ 
    public string Action {get; set;} 
    public Candidate CandidateModel { get; set; } 
} 

using (Html.BeginForm(Model.Action, "Candidate", ... 

レンダリングアクションを使用して

public ActionResult Create() 
{ 
    ViewData["PostBackAction"] = "New"; 
    ... 
} 


public ActionResult Edit(int id) 
{ 
    ViewData["PostBackAction'] = "Update"; 
    ... 
} 

例10

EDIT:あなたは(私は反対するが)、これはビューで行うべきであると感じた場合にあなたのコメントをもとに、あなたはViewContext.RouteData

<% 
    var action = "Create"; 
    if (this.ViewContext.RouteData.Values["action"] == "Edit") 
    { 
     action = "Update"; 
    } 
    using (Html.BeginForm(action, "Candidate", ... 
    { 
%> 
+0

これは動作しますが、私は本当にViewは、これは完全にビューベースされて、私は選択肢を追加 –

+0

を把握することができるはず何かを処理するために、コントローラのコードを変更したくないため

<form action="/Orders/Create" id="Model" method="post"> 

私はコントローラにポストバックするアクションを制御する適切な場所があると思うだろう。 – tvanfosson

+0

それはまさに私が探していたものです。アクション名は です。ViewContext.RouteData.Values ["action"] –

0
<% html.RenderPartial("MyUserControl", Model.ID) %> 
+0

こんにちは、コードのみの回答を掲示しないでください。あなたの答えは大きく改善されるでしょう。あなたのコードが何をしているのか、そしてこれがOPの問題を解決する方法についてのいくつかの説明。 –

+0

コードのみの回答は低品質であり、削除の対象となるため、仮定、条件、落とし穴などを扱っている質問について、少なくとも1つまたは2つの文(最適な段落)が必要です。 –

1

をオフに基づいて、いくつかのロジックを試みることができますアクションとコントローラとしてnullを渡します。拡張機能は現在のアクションと現在のコントローラのみを使用します

using (Html.BeginForm(null, null, FormMethod.Post, new { id="Model" })) 

この部分ビューの親ビューと同じアクションが生成されます。

それはURL http://localhost:1214/Orders/Edit/1

ため

<form action="/Orders/Edit/1" id="Model" method="post"> 

を生成し、...このURL http://localhost:1214/Orders/Create

関連する問題