【问题标题】:Post back view values to controller MV3回传视图值到控制器 MV3
【发布时间】:2012-04-26 01:23:00
【问题描述】:

我是 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”。

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

【问题讨论】:

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


    【解决方案1】:

    作为参考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(…) {
            //…
        }
    }
    

    【讨论】:

    • 不错的发现。我可以预见您可能会与按钮名称和操作发生冲突的情况,但我认为这是一个可行的解决方案。
    • 是的,我也找到了相同的解决方案,如果我们在同一个控制器内处理它看起来不错。如何从当前视图导航另一个控制器?你不应该创建另一个表单。
    • 在这种情况下,您可以在表单中放置一个简单的按钮。使用 ajax 序列化和发布任何操作和任何控制器...
    【解决方案2】:

    您可以像这样为您的回发方法指定一个 ActionName:

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

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

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

      • 我了解此解决方案,但我在同一视图的侧面有多个按钮,它们调用不同的控制器/动作。如果你在表单标签中给出动作,这与一个控制器动作紧密耦合。
      • @Vetrivelmp :检查此stackoverflow.com/questions/8258750/…
      • 我们不能直接将控制器 url 提供给按钮 onclick 事件吗?
      【解决方案4】:

      我认为我们可以在 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>
      

      【讨论】:

      • 我里面有很多按钮可以调用不同的控制器。怎么办
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多