C# ASP.NET MVC2-在加载用户控件时检查IsPostBack不会';似乎不对?

C# ASP.NET MVC2-在加载用户控件时检查IsPostBack不会';似乎不对?,c#,asp.net-mvc-2,C#,Asp.net Mvc 2,我有一个用户控件,其中包含以下代码: <form id="CurrencyForm" method="post" runat="server"> Display prices in&nbsp; <asp:DropDownList ID="currency" runat="server" AutoPostBack="true"> <asp:ListItem Value="GBP">GBP (£)</asp:L

我有一个用户控件,其中包含以下代码:

<form id="CurrencyForm" method="post" runat="server">    
    Display prices in&nbsp;
    <asp:DropDownList ID="currency" runat="server" AutoPostBack="true">
        <asp:ListItem Value="GBP">GBP (£)</asp:ListItem>
        <asp:ListItem Value="USD">USD ($)</asp:ListItem>
        <asp:ListItem Value="EUR">EUR (€)</asp:ListItem>
    </asp:DropDownList>
</form>
当我更改下拉列表的选择时,会触发回发。但是,
IsPostBack
的值似乎总是错误的。我不知道我到底做错了什么

解决方案

在看了大多数帖子的建议后,我明白我使用代码背后的代码等而不是控制器是错误的。我想出了如何使用动作基本上重定向回同一页面,因此我现在拥有以下内容:

用户控制:

<% using (Html.BeginForm("ChangeCurrency", "Home", FormMethod.Post)) {%>    
    Display prices in&nbsp;
    <select id="currency" name="currency">
        <option value="GBP">GBP (£)</option>
        <option value="USD">USD ($)</option>
        <option value="GBP">EUR (€)</option>
    </select>
    <input type="submit" value="change" /> // this is temporary to test the submit
<%} %>

您的代码正在检查Page.IsCallback而不是Page.IsPostback。

您的代码正在检查Page.IsCallback而不是Page.IsPostback。

MVC从不进行回发。因此,
IsPostBack
将始终正确地为false。你认为回发实际上是一篇文章,因为MVC不做回发。您不应该在MVC中使用ASP.NET服务器控件。

MVC从不进行回发。因此,
IsPostBack
将始终正确地为false。你认为回发实际上是一篇文章,因为MVC不做回发。您不应该在MVC中使用ASP.NET服务器控件。

如果这是MVC,则它的设置完全错误。MVC消除了回发的使用。如果需要此逻辑,您应该使用WebForms项目。

如果这是MVC,则其设置完全错误。MVC消除了回发的使用。如果需要此逻辑,您应该使用WebForms项目。

我应该注意,这在ASP.NET MVC 1中曾经起过作用。但是我们在ASP.NETMVC2中做了一个更改,使其无法工作

无论如何,这里的其他评论者都是正确的:视图中不应该有这样的逻辑,因为此逻辑属于控制器。

我应该注意,这在ASP.NET MVC 1中曾经起作用。但是我们在ASP.NETMVC2中做了一个更改,使其无法工作

不管怎样,这里的其他注释都是正确的:视图中不应该有这样的逻辑,因为该逻辑属于控制器。

1)丢失代码-在MVC“视图”(即aspx或.ascx文件)中不应该包含任何代码块,只需要标记和简短的代码片段来调用模型的属性等。还可以放弃“runat=server”属性,将“name”属性添加到所有要发布回服务器的输入元素中

2) 将表单的“action”属性设置为处理post的一个控制器上的URL

3) 向控制器添加与上面设置的URL相对应的操作。在它的check Request.Form[“currency”]中查看选择了什么值,并基于此设置会话变量

4) 通过此操作,您可以返回指定原始页面URL的重定向结果(?名称可能有点错误);这将告诉浏览器在发布数据后对原始页面执行“获取”请求。(这就是MVC允许您使用的模式,它可能非常有效)

5) 这本身不会为您提供autopostback所需的“值更改时自动发布”功能,因此我会在下拉列表中添加一个jQuery脚本来提交值更改时的表单。差不多


$("#currency").change(function(){ $("#CurrencyForm").submit(); });
(如果还没有脚本引用,则需要向jQuery添加脚本引用)

我希望这听起来不像是太多的工作!相信我,尝试一下,拥抱MVC,你永远不会回头

1)丢失代码隐藏-在MVC中,“视图”(即aspx或.ascx文件)并不意味着包含任何代码块,只包含标记和用于调用模型属性的短代码片段等。此外,还放弃“runat=server”属性,并将“name”属性添加到所有要发布回服务器的输入元素中

2) 将表单的“action”属性设置为处理post的一个控制器上的URL

3) 向控制器添加与上面设置的URL相对应的操作。在它的check Request.Form[“currency”]中查看选择了什么值,并基于此设置会话变量

4) 通过此操作,您可以返回指定原始页面URL的重定向结果(?名称可能有点错误);这将告诉浏览器在发布数据后对原始页面执行“获取”请求。(这就是MVC允许您使用的模式,它可能非常有效)

5) 这本身不会为您提供autopostback所需的“值更改时自动发布”功能,因此我会在下拉列表中添加一个jQuery脚本来提交值更改时的表单。差不多


$("#currency").change(function(){ $("#CurrencyForm").submit(); });
(如果还没有脚本引用,则需要向jQuery添加脚本引用)


我希望这听起来不像是太多的工作!相信我,尝试一下,拥抱MVC,你永远不会回头

这是MVC还是webForms?它看起来很像webforms。@西蒙:这是一个MVC2项目。这是MVC还是webforms?它看起来很像webforms。@西蒙:这是一个MVC2项目。啊,好吧,那就是问题所在!那么我如何在MVC中实现这一点呢?基本上我只想重置一个会话变量并刷新当前页面。我试着通过行动来实现这一点,但不知道如何实现?这个链接应该会有所帮助@James我会使用一个异步post来实现这一点,因为您只想将信息传递给服务器,而不需要将用户从页面中带走。使用
Ajax.BeginForm
而不是
Html.BeginForm
,并返回Json而不是重定向。根据我所在的页面(请记住,这在我的母版页上),我可能需要重新加载其他用户控件以使用更新的货币。我认为简单地刷新页面会更容易。有更好的选择吗?有。只需在JSON响应中返回所需的数据,然后

$("#currency").change(function(){ $("#CurrencyForm").submit(); });