【问题标题】:mvc3 - return bool from view to controllermvc3 - 从视图返回布尔值到控制器
【发布时间】:2012-10-18 07:46:29
【问题描述】:

背景

我在视图模型类中有一个布尔值。我有一个 if 语句检查布尔值是真还是假。如果为假,我将值设置为真并调用视图。在视图中,我有按钮,当点击更新并再次调用视图时。我的问题是加载视图时 bool 一直设置为 false。我不知道为什么会这样。有没有办法阻止布尔值被改变?

尝试

我知道 MVC 是无状态的。

我使用的视图是一个 .aspx 视图,其中输入标记的“值”属性已被使用。所以我无法更新提交按钮的值。

<input type="submit" class="button" value="bvCalc" />

问题

无论以何种方式,我都希望保持 bool 的状态。我不知道该怎么做,我不确定目前最好的做法是否是

  1. 在视图中使用隐藏字段
  2. 构建一个 HTML Helper Extension,将 bool 从 true 更新为 false
  3. 返回修改后的值,并将模型信息发送回控制器,以便我可以评估 if 语句中的数据。

【问题讨论】:

  • 你不能通过查询字符串将布尔值传回你的控制器吗?提交时在表单的 routevalues 中传递。它位于 @Html.BeginForm() 辅助方法的重载之一中。
  • 感谢您的建议,但管理层不允许我们在此项目上使用查询字符串。需要尽可能单页应用,但再次感谢。
  • 您应该指定 FormMethod.Post,或者为此使用会话变量。 Post 可能会更好,因此您不必每次都设置和擦除变量。
  • 重新阅读您的评论...“尽可能单页应用程序”是什么意思?如果您使用查询字符串回发到同一个控制器,然后重定向到同一个视图,那不就是一个单页应用程序吗?如果您不想回发,那么您可以使用 ajax 调用将布尔值回发到您的控制器,并根据控制器的响应使用局部视图来设置您的页面。
  • 抱歉耽搁了......我一直在尽我所能来完成这项工作......到目前为止没有运气......关于管理“单页应用程序”评论......只是意味着用户不允许在 url 中看到除域名之外的任何内容。

标签: c# asp.net-mvc-3 html-helper


【解决方案1】:

值从视图到控制器的方式是通过ModelBinding。如果您不熟悉它是如何工作的,您可能想谷歌它以获得更好的理解。

举个简单的例子,假设你想要将 bool 传递给的控制器中的操作方法如下所示:

public ActionResult MyAction(MyViewModel model)
{
  //.. do something here.
}

你的 ViewModel 看起来像这样:

public class MyViewModel
{  
   public bool MyBool { get; set; }
   // ...more properties...
}

只要您的视图有某种字段(例如文本框、复选框、隐藏字段),其名称与属性名称(在本例中为“MyBool”)完全匹配,并且值将转换为属性 (在此示例中,字符串 'True' 可以映射到布尔值 true) - ModelBinding 将能够在您的控制器操作中使用 true 填充 model.MyBool

如果您使用内置的辅助方法,则无需担心在字段元素中获取正确的名称/值 - MVC 会为您完成此操作

例如@Html.HiddenFor(model =&gt; model.MyBool) 将呈现类似于

的 HTML
<input type="hidden" id="MyBool" name="MyBool" value="True" />

【讨论】:

  • 好的,我已经尝试了上面提到的方法,但是我仍然遇到了问题。一切似乎都运行顺利,但是我(使用您的示例)“MyBool”默认从真到假。我不关心视图中呈现的内容(对于这个特定场景)......我关心的是......提交页面后,我需要访问一个值(通过重新初始化未更改)在提交的页面上。
  • 如果您可以从控制器操作中为您的问题添加一些代码,以及您呈现布尔属性的视图部分,我可能会提供帮助。
  • 这段代码应该可以满足您的需求。如果该值被重置,那么问题要么是您在页面上提交时设置不正确,要么是您在控制器中覆盖了它。可能如果您正在重新创建视图模型......单步执行代码应该可以让您确定哪里出错了。主要问题是,您如何在页面上设置 MyBool 的值?因为只是 Html.HiddenFor() 只会显示它在模型中的值,如果它是假的,那么它将提交一个假值。
  • 你是对的。视图模型不断被重新初始化。由于我缺乏经验,直到几分钟前我才意识到视图的 (.aspx) BeginForm(action, controller, http-method, id) 能够指定 ActionResult。如果我能弄清楚 如何从控制器中的 ActionResult 更新 BeginForm() 中的操作,我相信我可以解决这个问题并最终将此问题标记为已回答。
  • 你能澄清一下你的意思吗?您的意思是您需要设置表单将在视图中动态回发的操作吗?如果是这种情况,您可以添加设置一个在视图中调用的变量,例如 @Html.BeginForm(@( MyBool ? "Action1" : "Actions2"), controller, formmethod, routevalues, htmlvalues) 等...您可以在视图中添加代码,或者您可以在视图模型中使用字符串变量并在控制器中设置操作名称,然后在操作参数中将变量传递给您的表单。
【解决方案2】:

使用布尔值?在你的模型中。没有它,布尔值将始终默认为假。

【讨论】:

  • 公共布尔值?显示{得到;放; } //?空合并运算符允许空值而不是默认的 false
  • 我希望我错过了什么。添加 ?在我的 ViewModel 中使用 bool 会引发错误。但是,调试器没有捕捉到它,我收到了一封包含堆栈跟踪的电子邮件(在出现此类错误时发送),但没有任何迹象表明问题可能是什么。有吗?需要放置在模型中或..ViewModel 是否足够?
  • 经过一番挖掘,我发现位置和错误如下: .aspx(143): error CS0266: Cannot implicitly convert type 'bool?' '布尔'。存在显式转换(您是否缺少演员表?) 第 143 行:
  • 您需要声明“bool”?而不是控制器中的“布尔”。或者可能将视图模型作为参数提供给您的控制器,以从自动绑定中受益。您的模型可能需要为此声明一个默认构造函数...
  • 这行得通。它只是不适用于我正在使用的应用程序,但你不可能知道这一点。我在一个测试项目中测试了 Null-Coalle……它运行良好……我将从这里开始编写代码。谢谢!
猜你喜欢
相关资源
最近更新 更多
热门标签