【问题标题】:Setting text input's value from ViewBag? ASP.NET MVC5从 ViewBag 设置文本输入的值? ASP.NET MVC5
【发布时间】:2014-08-19 09:57:38
【问题描述】:

我正在从我的控制器传递一个变量 ViewBag.crimeRef 并使用它来显示一条运行良好的消息:

@if(ViewBag.crimeRef != null)
{
    <div class="alert alert-dismissable alert-danger">
      <button type="button" class="close" data-dismiss="alert">×</button>
      Sorry, there are no matching results for the crime reference <strong>@ViewBag.crimeRef</strong>. Please try searching again.
    </div>    
}

我想我也可以使用相同的方法来填充输入的值,但是我收到了 CS1002: ; expected 错误:

<input type="text" class="form-control" maxlength="11" id="crimeRef" name="crimeRef" placeholder="Crime reference"
        @if(ViewBag.crimeRef != null) { value="@ViewBag.crimeRef" }>

无论如何我可以使用 ViewBag 变量填充输入的值吗?

非常感谢

【问题讨论】:

标签: asp.net asp.net-mvc viewbag


【解决方案1】:

答案 1:-

<input type="text" class="form-control" maxlength="11" id="crimeRef" 
name="crimeRef" placeholder="Crime reference" 
value="@(ViewBag.crimeRef ?? String.Empty)" >

答案 2:-

我在这里包括尼克的答案,因为这是公认的答案,因此它将帮助其他 stackoverflow 用户在一个地方获得他们问题的答案。

从 MVC4 开始,条件语句实际上已内置到 Razor 中:

Conditional HTML Attributes using Razor MVC3

所以简单地使用这个:

<input type="text" class="form-control" maxlength="11" id="crimeRef" name="crimeRef" placeholder="Crime reference"
value="@(ViewBag.crimeRef)">

仅当ViewBag.crimeRef 不为空时才会呈现 value 属性 - 完美!

【讨论】:

  • ?? 语法无效。
  • 抱歉你是对的(我认为这里的情况很重要,但忘记了string 是有效的)。我个人倾向于在访问静态属性/方法时使用String,这就是它为我标记的原因。
【解决方案2】:

您当前尝试执行此操作的方式不起作用,value 不是服务器端变量,因此您不能像现在这样引用它。但是,您可以做一些更简单的事情

value='@(ViewBag.crimeRef ?? "")'

【讨论】:

  • @Nick 很明显,您试图在 HTML 外部 然后在服务器端运行此代码。你能告诉我你使用的 HTML 吗?我的代码与 Exception 编写的答案完全相同,只是更短 - 事实上,我必须更正他们的答案。
  • @Nick 不用担心,无论如何,您的答案都比我们两个都好,您应该将其标记为已接受的答案(我从未意识到 Razor 已更新为您这样做,在以前的版本中它会输出null)。
  • @Exception 我从来没有说过有,我只是说在我看来如果这种行为现在已经内置到 Razor 中,那么最好使用它,显然 OP 正在使用以后的版本,所以关于 他们的 问题,这是最好的答案。我们的答案没有任何问题,它们只是过时了 :) 但正如您所说,对旧版本很有用。
  • @Exception 如果我没记错的话,你的原始答案是@(ViewBag.crimeRef??ViewBag.crimeRef:string.Empty) - 这不是有效的?? 语法(正如我的评论指出的那样)。你在2014-08-19 10:00:41Z 上发布了这个答案,我在2014-08-19 10:03:41Z 上发表了评论,因此你的答案已经持续了 3 分钟——我几乎不会说这会打断你写答案。无论如何,对于我需要等待多长时间才能对答案发表评论没有任何规定,如果我看到错误的答案,我会在否决投票之前给予用户评论的礼貌,因为这通常是一个错字。
  • @Exception 我们不是“fighting”,我们正在讨论 :) 我觉得这里 best 的答案是由 Nick 发布的(或在事实,由 Andrei 评论)。但是,鉴于尼克不想要功劳并接受了您的答案,我的建议是更新您的答案以考虑尼克斯,以便其他偶然发现此问题的人获得最佳答案。
【解决方案3】:

从引用中删除 @ViewBag.crimeRef 并尝试此操作

<input type="text" class="form-control" maxlength="11" id="crimeRef" name="crimeRef" placeholder="Crime reference" value=@(String.IsNullOrEmpty(ViewBag.crimeRef)?ViewBag.crimeRef:String.Empty) />

【讨论】:

  • 条件运算符在这里不起作用,ViewBag.crimeRef 不能被评估为 bool - 您需要执行类似 String.IsNullOrEmpty(ViewBag.crimeRef) 的操作。
  • 感谢您的回答
【解决方案4】:
<input type="text" class="form-control" maxlength="11" id="crimeRef"   value="@((ViewBag.crimeRef==null)?0:ViewBag.crimeRef)" name="crimeRef" placeholder="Crime reference">

在控制器动作中

   ViewBag.crimeRef = null;   or        ViewBag.crimeRef = 1;

【讨论】:

  • 感谢您的回答
【解决方案5】:

从 MVC4 开始,Razor 中实际上内置了条件语句:Conditional HTML Attributes using Razor MVC3

所以简单地使用这个:

<input type="text" class="form-control" maxlength="11" id="crimeRef" name="crimeRef" placeholder="Crime reference"
    value="@(ViewBag.crimeRef)" }>

仅当 ViewBag.crimeRef 不为空时才会呈现 value 属性 - 完美!

感谢Andrei的指点!

【讨论】:

  • 很好的解决方案:) 没有所有的空检查和所有
  • 是的,与我之前尝试的相比,这是一个非常好的和优雅的解决方案!
  • 有趣,我不知道。
猜你喜欢
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多