我的模型绑定工作即使我没有在html中显示它

时间:2015-06-02 13:23:28

标签: c# asp.net asp.net-mvc razor model-binding

我有一个可以通过不同方式联系到的表单。在URL中,如果用户附带?data = johndoe(示例),我不想处理其他财产,所以我没有向用户显示,我也不在乎这个属性。因为我在用户提交表单时使用相同的表单和相同的控制器,我只想在控制器中接收其他属性为空,然后以不同的方式对待它。

所以

我有一个模型,我初始化并返回一个表单,

public class MyModel
{
public int selectedValue {get;set;}
public string data {get;set;}

public MyModel(){
this.selectedValue = 5;
}
}

public ActionResult Index(){
MyModel model = new MyModel(){};
Return View(model);
}

在视图中,我决定不显示selectedValue,以便在用户提交表单时将其作为空值接收,因此在表单中我只是

@Html.EditorFor(m => m.data)

并且对于selectedValue没有任何内容。

然后在控制器中

[HttpPost]
public ActionResult Index(MyModel model)
{
// here I get model.selectedValue = 5, WHY?
}

我想将model.selectedValue设为null如果我没有在表单中使用它,它看起来很正常,不是吗?

如果这是正常的,为什么以及如何从剃须刀页面解决此问题? 关于我该如何做到这一点的任何干净的想法?

提前致谢

3 个答案:

答案 0 :(得分:2)

你得到5因为你在构造函数中设置它

public MyModel(){
    // comment this line to get rid of 5
    // this.selectedValue = 5;  
}

您也不会将其设置为null,因为您使用int这是一种没有null值的值类型。您可以使用nullable int int?或某些默认值,例如-1来表示没有选择。

答案 1 :(得分:1)

它不是从表单传递的,但仍会生成MyModel的新实例,并且在构造函数中,您将值设置为5.

public class MyModel
{
    public int selectedValue {get;set;}
    public string data {get;set;}

    public MyModel() {
        // MyModel.selectedValue will always be 5 unless specified otherwise
        this.selectedValue = 5;
    }
}
  

我想将model.selectedValue设为null

在这种情况下,请将您的模型更改为:

public class MyModel
{
    public int? selectedValue {get;set;}
    public string data {get;set;}
}

如果您无法更改模型(例如第三方),则您必须在视图中“在剃刀视图中修复此问题”中提供值。您可以将其设置为零或其他一些魔术数字(使用常量...)来指示默认值。

答案 2 :(得分:0)

您在构造函数中初始化了变量selectedValue

当模型绑定创建实例时,也会调用此构造函数,这意味着selectedValue操作方法中的变量Index等于5.