在控制器

时间:2015-12-09 14:28:37

标签: c# asp.net-mvc

所以我刚刚开始制作一个新的mvc项目。我制作了一个日历(我自己),显示了一个月的日子。它有两个按钮,可让您在一年内获得BackForth个月。所以我的问题是我已经为它做了空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);
    }
}

感谢您的帮助! =)

2 个答案:

答案 0 :(得分:2)

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

除非您将此字段更改为getset的属性,否则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

  

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

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