2010-10-26 89 views
1

我有一个网站与ASP.NET MVC 1运行,并遇到了一个错误,其中我的模型中的布尔重置为默认值,因为该值未在视图。如何停止视图返回ASP.NET MVC中的默认值

为控制器代码:

public ActionResult Edit(Guid id) 
{ 
    Service service = GetService(id); 

    if (service == null) 
     return View("NotFound"); 

    return View(service); 
} 

当视图代码有:

<label for="IsActive"> Is Active: </label> 
<%= Html.TextBox("IsActive") %> 

它工作正常不过,一旦它被删除isActive域总是返回假。我不再希望isactive被看到或从该视图修改但去除它已经引起了值丢失,我已经尝试设置值,而不是与

<% Html.TextBox("IsActive"); %> 

显示,但仍然有其拖欠值为false

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Service service) 
{ 
    //UpdateLogic 
} 

在POST方法,无论什么IsActive收到过处,Service.IsActive始终为假

基本上我只是想知道我怎么可以让网站保持它的价值通过时不显示文本框视图(曾尝试用Google搜索,但未能获得话语权组合一个体面的结果)

回答

3

您可以将它作为一个隐藏在页面上:

<%= Html.Hidden("IsActive"); %> 
+1

谢谢你的完美(它需要等于工作,但除了它的伟大) - <%= Html.Hidden(“IsActive”)%> – Manatherin 2010-10-26 13:51:14

+0

这不是一个很好的方法来解决这个问题。无论如何,它将使编辑浏览器中的值非常容易,请检查我的修复程序。 – Stefanvds 2010-10-26 13:54:44

+1

@Stefanvds - 我不喜欢你的修复。看起来你在控制器中放置了很多不应该在控制器中的逻辑。我比你更喜欢ViewModel方法。 – Martin 2010-10-26 13:56:52

2

一个快速的解决方案,您可以使用隐藏字段而不是文本框并将值存储在那里。

一般来说,如果你不想显示或更新值,为什么把它发送到视图?只使用视图中实际需要的数据创建一个ViewModel并将其来回发送。

+1

我喜欢这种方法,很多工作,但我尽可能创建ViewModels。 – Martin 2010-10-26 13:49:33

-1

创建它作为一个隐藏的价值:

<input id="IsActive" type="hidden" value="true" /> 
3

你可以将其隐藏在页面上隐藏字段:

<% Html.Hidden("IsActive"); %> 

BUT!不建议这样做。因为操纵这个值非常容易,你不需要这个。

最好的方法就是从数据库中获取值。

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Service service) 
{ 
    Service originalService = GetService(id); 

    UpdateModel(originalService, new string[] { "Field1thatyouwanttoupdate", "fieldname2" }); 
} 

这样你更新所有你想要的字段,但不是IsActive字段。

+0

这应该被接受为答案。只绑定实际允许用户更新的字段。永远不要相信用户输入 – 2010-10-26 14:02:16

+1

@Jace Rhea - 如果你只应该绑定你实际上允许用户更新的字段,那么这不是答案 - Yakimych关于ViewModels的回答是。 – Martin 2010-10-26 14:22:06

+0

@Martin对不起,但我不同意。通过明确说明在UpdateModel方法中绑定哪些字段(省略IsActive),IsActive字段将永远不会更新。是的,你也可以创建一个单独的viewmodel类,但这看起来像是额外的,不必要的工作。 – 2010-10-26 14:31:42