0

私はmvc 3が初めてです。ビューとコントローラーを作成しようとしています。私のシナリオは、2 つのアクションを持つコントローラーがあることです。コントローラー内で最初のアクションを呼び出す間、表示するデフォルト値をロードする必要があります。ビュー内には、値をポストバックするためのボタンがあります。そのため、ビュー内のボタンの 1 つをクリックすると、同じコントローラーで 2 番目のアクションに移動し、成功または失敗のメッセージで同じビューに戻る必要があります。

私の見解はこんな感じです

@using (Html.BeginForm())
{
<table>
    <tr>
        <td>
            @Html.TextBox("txtTitle")
        </td>
        <td>
            <input type="button" value="Go Somewhere Else" onclick="location.href='@Url.Action("Postback", "Default1")'" />
        </td>
    </tr>
</table>

}

私のコントローラー、

public class Default1Controller : Controller
{
    //
    // GET: /Default1/

    public ActionResult Index()
    {
// has to default load value to text box
        return View();
        }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Postback(FormCollection obj)
    {
// has to take value from txt box
        object obj1 = Request["txtTitle"];
        return View("Index");
    }
}

それが機能する他のビューから Postback アクションを呼び出す場合、私の問題。しかし、同じビュー内でボタンをクリックすると、「http://localhost:14953/Default1/Postback」のようなエラーが表示されます。

ここでの解決策は何ですか?同じコントローラーだけでなく、同じフォーム内の他のコントローラーにも移動して、同じビューに戻ることを期待しています。

4

4 に答える 4

2

この記事を参考に……

public class HttpParamActionAttribute : ActionNameSelectorAttribute {
  public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) {
      if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
        return true;

      if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase))
        return false;

      var request = controllerContext.RequestContext.HttpContext.Request;
      return request[methodInfo.Name] != null;
  }
}

このようなビュー形式で...

@using (Html.BeginForm("Action", "Post")) { 
  <!— …form fields… -->
  <input type="submit" name="SaveDraft" value="Save Draft" />
  <input type="submit" name="Publish" value="Publish" />
}

そしてコントローラーのアクション...

public class PostController : Controller {
    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SaveDraft(…) {
        //…
    }

    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Publish(…) {
        //…
    }
}
于 2012-04-26T04:04:45.937 に答える
0

次のように、Postback メソッドに ActionName を指定できます。

[ActionName("Index")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Postback(FormCollection obj)...

そのため、F5 キーを押して同じ値を再送信し、アドレス バーから直接 URL を呼び出すと、期待どおりにビューが返されます。

于 2012-04-26T01:33:15.437 に答える
0

Html.BeginFormアクション名とコントローラー名を受け取る Helper メソッドのコンストラクターがあります。それを使って

public static MvcForm BeginForm(
    this HtmlHelper htmlHelper,
    string actionName,
    string controllerName
)

http://msdn.microsoft.com/en-us/library/dd492590.aspx

したがって、フォームは次のようになります。入力要素に onclick 関数は必要ありません。

@using (Html.BeginForm("Postback", "Default1"))
{
  //Your elements
 <input type="button" value="Go Somewhere Else"  />
}

これにより、HTML マークアップが次のようにレンダリングされます

<form action="/Default1/Postback" method="post">
 // Your elements
  <input type="button" value="Go Somewhere Else"  />
</form>

同じフォームに複数の送信ボタンが必要な場合は、ここで回答されています

于 2012-04-26T01:35:57.870 に答える
0

Htmlヘルパーで特定のアクションとコントローラーができると思います。

@using (Html.BeginForm("Postback", "Default1"))
{
  <table>
     <tr>
      <td>
        @Html.TextBox("txtTitle")
      </td>
      <td>
        <input type="submit" value="Go Somewhere Else" />
        <!-- the input should be submit?-->
      </td>
</tr>

于 2012-04-26T01:28:14.450 に答える