我是MVC的新手,我正在使用Razor。我有一个表单,用户可以在其中编辑文本字段,然后单击保存。这是我的表格
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "form" }))
{
...
@Html.TextArea("Description", Model.Description, 5, 50, null)
...
}
在我测试了这个并验证它正常工作后,我添加了一些服务器端检查。对于描述字段,我检查它不是空白。如果没有则显示错误消息。这是我的代码
[HttpPost]
public ActionResult EditContract(Contract contract)
{
if (contract.Description == null)
{
contract.Description = string.Empty;
}
contract.Description = contract.Description.Trim();
if (contract.Description == string.Empty)
{
ViewBag.Message = "Description can't be blank";
contract.LoadContract(contract.ContractId);
return View(contract);
}
...
}
这实际上都按我的意愿行事。然而,我很惊讶它确实如此。我的代码从数据库加载记录并将其作为模型传递给视图。视图如何知道不将文本框的值设置为模型中的值,并将其保留为用户上次输入的值?
修改
我创建了一个简单的项目来测试它,认为我的项目中的某些内容可能会影响它的工作方式。这个简单的项目是一个使用剃刀的空MVC 4项目。然后我添加了以下代码。
MyModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcApplication6.Models
{
public class MyModel
{
public string Name { get; set; }
}
}
HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication6.Models;
namespace MvcApplication6.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
var myModel = new MyModel();
return View(myModel);
}
[HttpPost]
public ActionResult Index(MyModel model)
{
model.Name = "something";
return View(model);
}
}
}
Index.cshtml
@model MvcApplication6.Models.MyModel
@using (Html.BeginForm())
{
@Html.TextBoxFor(model => model.Name)
<br />
<input type="submit" value="submit" />
}
我希望在用户点击提交后在文本框中显示“内容”,但事实并非如此。它具有用户之前输入的任何内容。我需要做些什么来让它显示“某事”?
谢谢,
答案 0 :(得分:0)
通常如果我想将一个字段传回控制器,我将使用for helper
@Html.TextAreaFor(x => x.Description, ...)
这将使用模型中的数据填充字段,如果字段更改,则更改的值将发送回控制器。我找到了非“for”帮助器,如果我将该字段命名为与我的模型名称相同(正如您所做的那样),它仍然会将更改后的值传递回控制器。 MVC将值绑定到加载字段,但发送回控制器的只是更改的值。希望这有助于:)