如果匹配的字段位于URL或发布数据中,MVC 4.5会忽略模型中的值?
本周末我看到了一些意想不到的行为 我创建了一个超级简单的页面来向正在学习它的人演示MVC。 它只有两个方法'Index()'和'[HttpPost]索引(字符串文本)'
模型包含一个项目,'string Text {get; set;}'
在Index() - get,我创建了一个模型,并将Text的值设置为“Enter some text”并返回View(model)
在cshtml文件中,我有两个项目:
@ Html.TextBoxFor(m => m.Text)
和
@ Model.Text
这只会显示文本的值。
还有一个提交按钮。 (将其提交给索引)
这是奇怪的地方。 在Post方法中,我简单地创建了一个新模型,将'Text'属性设置为任何传入的文本+“!!”
我预计,如果我将文本设置为'a',并按下按钮,它应该重新显示'a !!' 在文本框中以及显示'a !!' 在那之下。
但是,相反,编辑框的值保持不变,并且@ Model.Text的值会更改!
如果使用text = A执行GET URL,也会发生这种情况 - 然后无论您在模型中传递什么内容,它都会覆盖TextBoxFor / TextAreaFor中使用的值并显示“A”! 但是,@ Model.Text的值将被正确显示为传递给视图的模型中的值。
似乎他们必须竭尽全力来打破这一点 - 支持从URL /发布数据而不是模型获取数据。
跆拳道?
控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TestApp.Models;
namespace TestApp.Controllers
{
public class homeController : Controller
{
public ActionResult Index()
{
TestModel model = new TestModel { Text = "Enter your text here! };
return View(model);
}
[HttpPost]
public ActionResult Index(TestModel model)
{
model.Text = model.Text + "!!";
return View(model);
}
}
}
视图:
@using TestApp.Models
@model TestModel
@using (Html.BeginForm("Index", "Home"))
{
@Html.TextAreaFor(m => m.Text, 10,50,null)
<br />
<hr />
<br />
@Model.Text
<br>
<button type="submit">Save</button>
}
为了完整性,模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace TestApp.Models
{
public class TestModel
{
public string Text { get; set; }
}
}
这是设计。 Request
和/或ViewData
(包括ViewBag
)用于创建ModelState
对象, ModelState
值覆盖模型中的值。 为了使发布的值覆盖实际的模型数据,这是必要的。
以用户发布表单的情况为例,但有一个错误会阻止数据被保存。 用户被发回到表单。 现在该怎么办? 由于数据未保存,该模型仍然具有数据库中的原始值或其他值。 如果模型的值优先,则用户以前输入的任何内容都将被覆盖。 但是,如果使用ModelState
值,则用户会看到表单,因为它们最初提交了该表单,并且可以进行任何必要的修改以再次提交。 显然,后一种选择是最理想的选择。
上一篇: MVC 4.5 ignores value in model if a matching field is in URL or post data?
下一篇: Can use interfaces in creating my models in Entity Framework Codefirst?