如果匹配的字段位于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值,则用户会看到表单,因为它们最初提交了该表单,并且可以进行任何必要的修改以再次提交。 显然,后一种选择是最理想的选择。

链接地址: http://www.djcxy.com/p/60451.html

上一篇: 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?