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

本文关键字:html 显示 绑定 模型 工作 我的 | 更新日期: 2023-09-27 17:52:17

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

我有一个模型,我初始化并返回到一个形式,

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。

Then In the controller

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

我想要得到模型。selectedValue at null如果我没有在表单中使用它,它看起来很正常,不是吗?

如果是正常的,为什么?我如何从剃刀页面修复这个问题?我该怎么做呢?

Thanks in advance

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

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

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

您也不会将其设置为null,因为您使用的int是一种没有null作为值的值类型。您可以使用可空的int int?或一些默认值,如-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;
    }
}

我想要得到模型。selectedValue at null

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

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

如果你不能改变模型(例如第三方),那么你必须在视图中提供一个值"在剃刀视图中修复这个问题"。您可以将其设置为0或其他魔术数字(使用常量…)来指示默认值。

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

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