将控制值发布到控制器

Posted

技术标签:

【中文标题】将控制值发布到控制器【英文标题】:Post control values to controller 【发布时间】:2012-07-07 20:37:36 【问题描述】:

我的视图中有一个开始日期搜索框。

这 POST 到我的控制器,然后在所选日期之间搜索可用房间。然后结果会再次列在视图中。

我习惯了 WebForms,您可以在其中 PostBack 并获取任何控制数据 - 但是在 MVC 中您不能这样做。

显示结果后,如何将已选择的 RoomId POST 回控制器:

 @html.ActionLink("Book Room","Book", new  id=item.RoomId )

...以及来自 TextBoxes 的 tbFrom 和 tbTo 日期?

下面是我的观点。

感谢您的帮助,

标记

@model IEnumerable<ttp.Models.Room>
@
ViewBag.Title = "Avail";


<h2>Avail</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm())

    <p>
        Availability between @Html.TextBox( "dteFrom" , String.Format( "0:dd/MM/yyyy", DateTime.Now) , new   @class = "datepicker span2"  ) 
                         and @Html.TextBox( "dteTo" , String.Format( "0:dd/MM/yyyy", DateTime.Now) , new   @class = "datepicker span2"  )
        <input type="submit" value="Search" /></p>

<table class="table table-striped table-bordered table-condensed" style="width:90%" id="indexTable" >
<tr>
    <th>
        @Html.DisplayNameFor(model => model.RoomName)
    </th>
</tr>

@foreach (var item in Model) 
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.RoomName)
        </td>
...
...
        <td>
            @Html.ActionLink("Book Room","Book", new  id=item.RoomId ) 
        </td>
    </tr>


</table>

【问题讨论】:

【参考方案1】:

使您的视图具有强类型...并且要了解 mvc.net 中的强类型视图是什么,这里有几个链接

http://www.howmvcworks.net/OnViews/BuildingAStronglyTypedView

What is strongly-typed View in ASP.NET MVC

http://blog.stevensanderson.com/2008/02/21/aspnet-mvc-making-strongly-typed-viewpages-more-easily/

如果您在应用程序中设置了默认路由,那么在您的POST 操作结果中,您可以获得id 作为路由值,例如

[HttpPost]
public ActionResult POSTACTION(int id)
 //here you will get the room id 

但从代码中我看到的是您没有发布表单,在这种情况下,actionlinks 会发出 GET 请求,从操作结果中删除 [HttpPost] 操作过滤器...

编辑

可能我只是误解了这个问题......在你目前的情况下,如果ajax 是一个选项,你可以做这样的事情

为您的操作链接分配一个类,例如

   @Html.ActionLink("Book Room","Book", new  id=item.RoomId ,new@class="roomclass",id=item.RoomId)

现在为它附加一个点击事件处理程序

$(function()
 $(".roomclass").on("click",function(e)
   e.preventDefault(); //prevent the default behaviour of the link 
   var $roomid = $(this).attr("id");//get the room id here 
   //now append the room id using hidden field to the form and post this form 
   //i will assume that you have only one form on the page 
   $("<input/>",type:'hidden',name="RoomId",value:$roomid).appendTo("form");
   $("form").submit();   
  );
);

指定表单将发布到的操作名称和控制器

@using (Html.BeginForm("MyAction","ControllerName",FormMethod.POST))...

在您的控制器中,您将拥有类似

的内容
[HttpPost]
public ActionResult MyAction(int RoomId,DateTime? dteFrom ,DateTime? dteTo )
 //you will get the form values here along with the room id 
 // i am not sure about the type `DateTime?` parameteres if this doesn't work try using string dteFrom and string dteTo

【讨论】:

嗨@John - 谢谢 - 我可以得到 ID 没问题 - 这就是我还包括我不确定的 dteFrom 和 dteTo 值的方式。我已经阅读了您提供的链接,但我仍然不清楚当我列出了许多具有唯一 ID 的房间时,如何发布/获取 ID 并包含文本框中的起始日期和结束日期.再次感谢,马克 嗨@John - 我还没有让它工作,但可以看到你指向我的地方,并且 80%​​ 理解它 - 我会接受你的建议,做更多搜索,我敢肯定我会在接下来的一两天内让它工作。非常感谢您花时间让我走上正轨,我真的很感激。干杯,马克

以上是关于将控制值发布到控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HttpWebRequest 将数据发布到 MVC 控制器?

Jquery Ajax 无法将模型发布到控制器

将 JSON 发布到 Codeigniter 控制器

使用 AJAX 将 JavaScript 数组发布到 asp.net MVC 控制器

将 JSON 发布到控制器返回 400 错误请求

如何使用 ajax 将 json 字符串发布到控制器方法?