Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新控制器中的模型_C#_Asp.net Mvc - Fatal编程技术网

C# 更新控制器中的模型

C# 更新控制器中的模型,c#,asp.net-mvc,C#,Asp.net Mvc,所以我刚开始做一个新的mvc项目。我自己制作了一个日历,上面显示了一个月的天数。它有两个按钮,可以让你在一年中获得返回和前进个月。所以我的问题是我已经为它编写了空Javascript。逻辑在模型中 现在每次某人。例如点击Forth按钮,视图将创建一个HttpPost,该HttpPost应将带有逻辑的模型发送给控制器 控制器应更新该值,并发送带有更新模型的“新视图” 这里有一个小演示,它更容易解释我的问题。 在本例中,我希望每次sb时将(Model)-变量“Number”增加1。点击按钮。但是我不

所以我刚开始做一个新的mvc项目。我自己制作了一个日历,上面显示了一个月的天数。它有两个按钮,可以让你在一年中获得
返回
前进
个月。所以我的问题是我已经为它编写了空Javascript。逻辑在模型中

现在每次某人。例如点击
Forth
按钮,视图将创建一个HttpPost,该HttpPost应将带有逻辑的模型发送给控制器

控制器应更新该值,并发送带有更新模型的“新视图”

这里有一个小演示,它更容易解释我的问题。 在本例中,我希望每次sb时将(Model)-变量“Number”增加1。点击按钮。但是我不想使用Javascript。那有可能吗

当前状态: 如果我点击按钮添加,变量“Number”将增加1,只增加一次。 后来它什么也没做。不知何故,模型没有更新回视图。我做错了什么

型号

public class TestModel
{
    public int Number = -10;
}
查看

@model MyProject.Models.TestModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <h4>TestModel</h4>
        <hr />
    </div>
        @using (Html.BeginForm())
        {
            @Html.DisplayFor(model => model.Number)
            <p>
                <input id="BtnAdd" name="myButton" type="submit" value="Add" />
            </p>
        }
</body>
</html>     
谢谢你的帮助!=)

您正在使用
@Html.DisplayFor(model=>model.Number)
,它不会将数据传回控制器。将
@Html.HiddenFor(model=>model.Number)
添加到视图中的表单中,然后将隐藏值传递回控制器

根据

如果属性类型为基元类型(整数、字符串等),则该方法将呈现表示属性值的字符串

表单中不会提交普通字符串,而会提交隐藏的输入。

您正在使用的
@Html.DisplayFor(model=>model.Number)
,它不会将数据传回控制器。将
@Html.HiddenFor(model=>model.Number)
添加到视图中的表单中,然后将隐藏值传递回控制器

根据

如果属性类型为基元类型(整数、字符串等),则该方法将呈现表示属性值的字符串


表单中不会提交普通字符串,而会提交隐藏的输入。

问题是,每次发布表单时,MVC都会尝试进行模型绑定,因此它会为您创建一个新的对象
TestModel
类,在该类中,您将此字段的默认值设置为-10。因此它将使用该值

除非将此字段更改为具有
get
set
的属性,否则Model binder无法(从发布的数据)为其设置值

所以像这样更改视图模型

public class TestModel
{
    public int Number {set;get;};
}
根据需要在GET操作中设置初始值

public ActionResult Index()
{
  var vm=new TestModel { Number =10 };    
  return View(vm);
}
当用户提交表单时,您需要再次从表单发送更新后的
Number
值。请将该值保存在表单中的隐藏字段中,以便新值可用

@using (Html.BeginForm())
{
    @Html.HiddenFor(model => model.Number)
    @Html.DisplayFor(model => model.Number)
    <p>
       <input id="BtnAdd" name="myButton" type="submit" value="Add" />
    </p>
}

问题是,每次发布表单时,MVC都会尝试进行模型绑定,并为此创建一个新的对象
TestModel
类,在该对象中,您将该字段的默认值设置为-10。因此它将使用该值

除非将此字段更改为具有
get
set
的属性,否则Model binder无法(从发布的数据)为其设置值

所以像这样更改视图模型

public class TestModel
{
    public int Number {set;get;};
}
根据需要在GET操作中设置初始值

public ActionResult Index()
{
  var vm=new TestModel { Number =10 };    
  return View(vm);
}
当用户提交表单时,您需要再次从表单发送更新后的
Number
值。请将该值保存在表单中的隐藏字段中,以便新值可用

@using (Html.BeginForm())
{
    @Html.HiddenFor(model => model.Number)
    @Html.DisplayFor(model => model.Number)
    <p>
       <input id="BtnAdd" name="myButton" type="submit" value="Add" />
    </p>
}

我只是按照u和Slappywag告诉我的那样做了改变。但不知何故,它仍然只更新了一些。就你而言。值是10,点击按钮后,它到达11并停留在那里。顺便说一句,我没有触摸索引(POST)。它仍然是一样的method@manuchao您需要清除模型状态字典。看我更新的答案。我只是做了u和Slappywag告诉我的更改。但不知何故,它仍然只更新了一些。就你而言。值是10,点击按钮后,它到达11并停留在那里。顺便说一句,我没有触摸索引(POST)。它仍然是一样的method@manuchao您需要清除模型状态字典。请参阅我的最新答案。