从ViewBag设置文本输入的值?ASP.NET MVC5

8

我正在从我的控制器传递一个变量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变量填充输入框的值?
非常感谢。

1
可能是 Conditional HTML Attributes using Razor MVC3 的重复问题。 - Andrei
哇,太棒了,谢谢! - Nick
5个回答

21

答案 1:

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

答案 2:

我在这里包含了Nick的回答,因为这是被接受的答案,所以它将帮助其他stackoverflow用户在一个地方获得他们问题的答案。

条件语句实际上已经内置在 Razor 中,自 MVC4 起:

使用 Razor MVC3 的条件 HTML 属性

因此,只需要使用以下代码:

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

只有在 ViewBag.crimeRef 不为空时才会呈现值属性 - 完美!


这不是有效的 ?? 语法。 - James
抱歉,你是正确的(我假设大小写很重要,但忘记了string是有效的)。个人倾向于在访问静态属性/方法时使用String,这就是为什么它对我进行了标记。 - James

3

从MVC4开始,条件语句已经内置到了Razor中:使用Razor MVC3的条件HTML属性

因此,只需使用以下内容:

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

如果ViewBag.crimeRef不为空,则只呈现值属性 - 完美!

感谢Andrei的指引!


1
很棒的解决方案 :) 没有所有的空值检查。 - Rohith Nair
是的,与我之前尝试过的相比,这是一个非常好的和优雅的解决方案! - Nick
有趣,我之前不知道那个。 - James

1

从引用中删除@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) 的操作。 - James
谢谢你的回答。 - Nick

1
你目前尝试的方法行不通,因为value不是服务器端变量,所以你不能像你现在这样引用它。不过,你可以做一些更简单的事情。
value='@(ViewBag.crimeRef ?? "")'

1
@Nick 显然你试图在服务器端而不是 HTML 中运行这段代码。你能给我展示一下你使用的 HTML 吗?我的代码与 Exception 给出的答案完全相同,只是更短而已——实际上,我还不得不纠正他们的答案。 - James
1
@Nick 不用担心,你的回答比我们两个都好,你应该将其标记为被接受的答案(我从未意识到 Razor 已经更新以便为你完成此操作,在之前的版本中它会输出“null”)。 - James
1
@异常 我从未说过有什么问题,我只是在表达我的观点,如果这种行为现在已经内置到Razor中,那么最好使用它,显然OP正在使用较新的版本,所以相对于他们的问题,这是最好的答案。我们的答案没有任何问题,只是过时了 :) 但正如你所说,对于旧版本仍然有用。 - James
1
@Exception 如果我没记错的话,你原来的答案是 @(ViewBag.crimeRef??ViewBag.crimeRef:string.Empty) - 这不是有效的 ?? 语法(正如我的评论所指出的)。你在 2014-08-19 10:00:41Z 发布了那个答案,我在 2014-08-19 10:03:41Z 发表了评论,因此你的答案已经上线了3分钟 - 我几乎不能称之为打断你写答案。无论如何,没有规定我需要等多长时间才能对答案发表评论,如果我看到一个错误的答案,我会先礼貌地评论再进行投票,因为往往这只是一个笔误。 - James
1
@Exception 我们不是在“争吵”,我们只是在讨论 :) 我认为这里最好的答案是由Nick发布的(实际上是由Andrei评论的)。然而,考虑到Nick不想得到荣誉,并且已经接受了你的答案,我的建议是更新你的答案,以便考虑到Nick的答案,这样其他人在查看时可以得到最好的答案。 - James
显示剩余9条评论

1
<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;

谢谢你的回答。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接