所以我刚刚开始制作一个新的mvc项目。我制作了一个日历(我自己),显示了一个月的日子。它有两个按钮,可让您在一年内获得Back
和Forth
个月。所以我的问题是我已经为它做了空Javascript。逻辑在模型中。
现在每次都是某人。点击例如Forth
按钮,视图创建一个HttpPost,它应该将带有逻辑的Model发送给控制器。
控制器应更新该值并发送"新视图"使用更新的模型。
这是一个小型演示,更容易解释我的问题。 在这种情况下,我想增加(模型) - 变量"数字"每次sb。点击按钮。但我不想使用Javascript。这可能。
现状:
如果我按下按钮Add
变量" Number"增加1,只增加一次。
之后它只是没有做任何事情。不知何故,模型doest更新回到视图。我做错了什么?
模型
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>
控制器
public class TestController : Controller
{
public TestModel currView = new TestModel();
// GET: Test
public ActionResult Index()
{
//Main
return View(currView);
}
[HttpPost]
public ActionResult Index(TestModel model)
{
model.Number += 1;
//ModelState.Clear();
//Somehow the model doesnt get passed correctly
return View(model);
}
}
感谢您的帮助! =)
答案 0 :(得分:2)
问题是,每次发布表单时,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>
}
此外,由于您要更新视图模型的值,因此需要清除模型状态字典。您可以使用ModelState.Clear
方法来执行此操作。
[HttpPost]
public ActionResult Index(TestModel model)
{
model.Number = model.Number +1;
ModelState.Clear();
return View(model);
}
答案 1 :(得分:1)
您正在使用
@Html.DisplayFor(model => model.Number)
,它不会将您的数据传回控制器。在视图中的表单中添加@Html.HiddenFor(model => model.Number)
,然后隐藏的值将传递回控制器。
根据DisplayFor的Documentation
如果属性类型为基本类型(整数,字符串等),则该方法呈现表示属性值的字符串。
不会在表单中提交普通字符串,而隐藏的输入将是。