将后视图值发布到控制器MV3

时间:2012-04-26 01:23:01

标签: c# asp.net-mvc-3 razor

我是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");
    }
}

我的问题是如果从任何其他视图调用回发操作它的工作原理。但在同一视图中,如果我点击按钮,则错误显示为“http:// localhost:14953 / Default1 / Postback”。

这里的解决方案是什么? 我希望导航到同一个控制器以及同一表单内的其他控制器并返回相同的视图。

4 个答案:

答案 0 :(得分:2)

参考这个article .....

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(…) {
        //…
    }
}

答案 1 :(得分: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>

答案 2 :(得分:0)

您可以为Postback方法指定一个ActionName,如下所示:

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

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

答案 3 :(得分: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>

如果您想要同一表单中的多个提交按钮,则会回答here