モデル(ユーザー)を表示するコントローラーがあり、アクティブ化するボタンだけで画面を作成したいと考えています。フォームにフィールドが必要ありません。私はすでにURLにIDを持っています。どうすればこれを達成できますか?
5 に答える
[ActionName] 属性を使用します。この方法では、URL が同じ場所を指しているように見えますが、HTTP メソッドに応じて異なるアクションを実行できます。
[ActionName("Index"), HttpGet]
public ActionResult IndexGet(int id) { ... }
[ActionName("Index"), HttpPost]
public ActionResult IndexPost(int id) { ... }
または、コードで HTTP メソッドを確認することもできます。
public ActionResult Index(int id)
{
if (string.Equals(this.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
{ ... }
}
これについてのパーティーには少し遅れましたが、GET でプロンプトを表示し (「本当に何とか何とかしたいですか?」)、次に POST を使用して実行する、かなり一般的なユースケースであると私が思うより簡単な解決策を見つけました。同じ引数。
解決策:オプションのパラメーターを使用します。隠しフィールドなどは必要ありません。
注: これは MVC3 でのみテストしました。
public ActionResult ActivateUser(int id)
{
return View();
}
[HttpPost]
public ActionResult ActivateUser(int id, string unusedValue = "")
{
if (FunctionToActivateUserWorked(id))
{
RedirectToAction("NextAction");
}
return View();
}
最後に、string.Empty は""
コンパイル時の定数でなければならないため、代わりに使用することはできません。そして、他の誰かが見つけられるように面白いコメントを入れるのに最適な場所です:)
フォーム内で隠しフィールドを使用できます。
<% using (Html.BeginForm()) { %>
<%= Html.HiddenFor(x => x.Id) %>
<input type="submit" value="OK" />
<% } %>
または、次の形式のアクションで渡します。
<% using (Html.BeginForm("index", "home",
new { id = RouteData.Values["id"] }, FormMethod.Post)) { %>
<input type="submit" value="OK" />
<% } %>
私のアプローチは、未使用のパラメーターを追加しないことです。これは、混乱を招くように思われ、一般的に悪い習慣です。代わりに、アクション名に「Post」を追加します。
public ActionResult UpdateUser(int id)
{
return View();
}
[HttpPost]
public ActionResult UpdateUserPost(int id)
{
// Do work here
RedirectToAction("ViewCustomer", new { customerID : id });
}
このような単純な状況の最も簡単な方法は、送信ボタンに名前を付けて、値があるかどうかをアクションでチェックすることです。値がある場合は Post アクション、そうでない場合は Get アクション:
<% using (Html.BeginForm("index", "home",
new { id = RouteData.Values["id"] }, FormMethod.Post)) { %>
<input type="submit" value="OK" name="btnActivate" />
<% } %>
C の場合、get および post コントローラー メソッドを 1 つに組み合わせることができます。
public ActionResult Index(int? id, string btnActivate)
{
if (!string.IsNullOrEmpty(btnActivate))
{
Activate(id.Value);
return RedirectToAction("NextAction");
}
return View();
}