mvc中的复选框返回null

时间:2014-07-20 10:01:49

标签: c# asp.net-mvc asp.net-mvc-4 checkbox

我有这样的模特

    public Nullable<bool> Space { get; set; }

    public Nullable<bool> Lab { get; set; }

    public Nullable<bool> Consultation { get; set; }

    public Nullable<bool> Financial { get; set; }

    public Nullable<bool> Other { get; set; } 

在我的视图中,我初始化复选框,如您所见:

@Html.CheckBoxFor(model => model.Space.Value, new { id = "CheckSpace" })  
@Html.CheckBoxFor(model => model.Lab.Value, new { id = "CheckLab" }) 
@Html.CheckBoxFor(model => model.Consultation.Value, new { id = "CheckConsultation"}) 
@Html.CheckBoxFor(model => model.Financial.Value, new { id = "CheckFinancial" }) 
@Html.CheckBoxFor(model => model.Other.Value, new { id = "CheckOther" }) 

但是当我将视图发布到我的控制器时,所有复选框的值都为空,你能不能给一些帮助?

enter image description here

7 个答案:

答案 0 :(得分:3)

修改

您应该将属性bool而不是bool?绑定到@Html.CheckBoxFor。帮助程序只能理解值truefalse。然后使用

@Html.CheckBoxFor(model => model.Space, new { id = "CheckSpace" })  
@Html.CheckBoxFor(model => model.Lab, new { id = "CheckLab" }) 
@Html.CheckBoxFor(model => model.Consultation, new { id = "CheckConsultation"}) 
@Html.CheckBoxFor(model => model.Financial, new { id = "CheckFinancial" }) 
@Html.CheckBoxFor(model => model.Other, new { id = "CheckOther" }) 

助手会生成

<input type="checkbox" name="Model Name" value="true" /> 

<input type="hidden" name="Model Name" value="false" /> 

这样当未选中复选框时,会向服务器发送一个值。

您可能也不想为每个复选框设置特定的ID,而是让框架生成一个;您可以使用例如

获取模型属性的id
@Html.IdFor(model => model.Space)

答案 1 :(得分:2)

他们发布了null,因为 id name 应该与使用Model属性绑定的元素相同,并且您正在修改id:

这样做:

@Html.CheckBoxFor(model => model.Space) 

它将被渲染为:

<input type="checkbox" id="Space" name="Space"/>

如果你修改了id,那么id和name就是你的模型属性的名称,该属性不会被绑定到post中的模型,你将获得null。

答案 2 :(得分:2)

@Html.CheckBoxFor()不会使用可空的bool。如果您检查@Html.CheckBoxFor(m =>m.Space.Value)生成的html,您会看到类似

的内容
<input type="checkbox" name="Space.Value" .....

但您没有名为Space.Value的属性,只有Space

如果使用@Html.EditorFor(),您将看到它生成一个包含3个值的选择(对于true,false和null)。

答案 3 :(得分:1)

检查您的复选框是否已禁用。 如果在视图侧禁用复选框,则始终将空值发送回已禁用属性的模型。

任何CSS类将checkbox disabled属性设置为true。

答案 4 :(得分:1)

您可以使用:

@Html.CheckBoxFor(m=>m.Space.Value,new{Name="Space"}),

我希望这会有效,模型绑定会以常规方式发生。

答案 5 :(得分:0)

它会起作用:

switch(r)
{
    case "open google":
        Process.Start("https://google.com");
        break;

    case "what's up":
        OpenRandomSite();
        break;
}

答案 6 :(得分:0)

关于此: 使用MVC5,Razor和C#,我做到了:

我的模型是这样的:

 public function store(Request $request)
   {

// Upload image 1
       $image1 = $request->file('file1');
       $avatarName = $image1->getClientOriginalName();

       $image1->move(storage_path('app/public/images/image1'),$avatarName);
       $imageUpload = new Image();
       $imageUpload->filename = $avatarName;
       $imageUpload->save();
       return response()->json(['success'=>$avatarName]);

// Upload image 2
       $image2 = $request->file('file2');
       $avatarName = $image2->getClientOriginalName();

       $image2->move(storage_path('app/public/images/image2'),$avatarName);
       $imageUpload = new Image();
       $imageUpload->filename = $avatarName;
       $imageUpload->save();
       return response()->json(['success'=>$avatarName]);

//Save image names in the database   
       $user = Auth::user();
       $property = new Property;

       $property->user_id = auth()->user()->id;
       $property->image1 = $image1;
       $property->image2 = $image2;

       $user->save();
       $property->save();
       return redirect('/users/listings')->with('success', 'Listing has been created.');   
   }
}

我的视图以类似于Tinyint的布尔值

public partial class SOME_CLASS {
    ...
    public byte COM { get; set; }
    ...
}

选中状态将发送 value =“” 属性中的值