我使用ASP.NET MVC 4通过Html.BeginForm()编辑模型对象。问题是当我传递要编辑的模型对象时,正确呈现的视图的唯一部分是Ok button.Html.TextBoxFor()在视图中不显示或在fieldset中显示为文本,即使我放置了' @& #39;在它之前。这是代码:
AddEdit.cshtml
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>AddEdit</title>
</head>
<body>
<div>
@using (Html.BeginForm("Edit", "Home", FormMethod.Post))
{
<fieldset>
@Html.TextBoxFor(model => model.Hero.Name);
<input type="submit" value="OK" />
</fieldset>
}
</div>
</body>
</html>
这是我的控制器类:
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
public string GetData()
{
return JsonConvert.SerializeObject(new {data = new HeroStorage().GetAllViewModels()});
}
[HttpPost]
public void Edit(AddEditViewModel model)
{
new HeroStorage().Update(model.Hero);
RedirectToAction("Index");
}
//RETURNS THE VIEW
[HttpGet]
public ActionResult Edit(int ID)
{
return View("AddEdit", new AddEditViewModel(){Hero = new HeroStorage().GetByID(ID), Studios = new StudioStorage().GetAll()});
}
}
答案 0 :(得分:1)
发生这种情况是因为在更新“编辑后发布方法”中的内容后,您将重定向到INDEX
,而@Html.TextBoxFor(m => m.Hero.Name)
反过来不会将任何模型传递给视图,因此TextBoxFor
为空。< / p>
更新:
最后,通过将EditorFor
更改为{{1}}
答案 1 :(得分:0)
我会将此作为评论发布,但它不会是可读/等我认为你可以充分利用它。但是,以下是框架中的一些自动生成代码:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Pot</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.TrailerID)
@Html.HiddenFor(model => model.Pot)
<div class="form-group">
@Html.LabelFor(model => model.Capacity, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Capacity, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Capacity, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Comments, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Comments, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Comments, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
}
这里要看的主要内容是:
@Html.EditorFor(...
AntiForgeryToken
编辑的[HttpPost]
方法:
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "TrailerID,Pot,Capacity,Comments")] tbl_Pot tbl_Pot)
{
if (ModelState.IsValid)
{
db.Entry(tbl_Pot).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(tbl_Pot);
}
PS /免责声明:请不要担心我的tbl /条目的命名,因为这些是指燃料系统,而不是任何其他类型的'Pot'
答案 2 :(得分:0)
这是哪个浏览器? 您的代码似乎适用于IE 11和Chrome - 即我只是复制/粘贴它并收到文本框。但是,我想提及以下内容:
@Html.TextBoxFor(model => model.Hero.Name)
之后松散分号。
你不需要在Razor表达式中使用它。@Html.TextBoxFor(model => model.Hero.Name)
指的是名为“model”的未知对象。
请记住,属性是指实际模型
Model
,而不是“模特”。我建议改变
@Html.TextBoxFor(model => model.Hero.Name)
来
@Html.TextBoxFor(**heroName** => **M**odel.Hero.Name)
。在语义上它
会更正确吗?可读的。