0

我是 mvc 3 的新手。我正在尝试创建一个视图和控制器。我的情况是我有控制器,它有两个动作。当我在控制器内调用第一个操作时,我必须加载默认值才能查看。内部视图我有一个按钮来回发值。因此,当单击视图内的按钮之一时,它必须在同一控制器中执行第二个操作,并且必须返回同一视图并显示成功或失败消息。

我的看法是这样的

@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

我认为我们可以在 Html helper 中指定具体的操作和控制器。

@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 回答
0

您可以像这样为 Postback 方法指定一个 ActionName:

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

因此 F5 重新发布相同的值并直接从地址栏调用 URL 会按预期返回视图。

于 2012-04-26T01:33:15.437 回答
0

Html.BeginFormHelper 方法有一个构造函数,它采用动作名称和控制器名称。使用那个

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 回答