Html.TextBoxFor()未在视图中显示或在字段集中显示为文本

时间:2014-10-13 09:14:47

标签: asp.net asp.net-mvc

我使用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()});
        }

    }

3 个答案:

答案 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>
}

这里要看的主要内容是:

  1. 使用@Html.EditorFor(...
  2. AntiForgeryToken
  3. 我正在使用EF
  4. 编辑的[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 - 即我只是复制/粘贴它并收到文本框。但是,我想提及以下内容:

  1. @Html.TextBoxFor(model => model.Hero.Name)之后松散分号。 你不需要在Razor表达式中使用它。
  2. @Html.TextBoxFor(model => model.Hero.Name)指的是名为“model”的未知对象。 请记住,属性是指实际模型 Model,而不是“模特”。我建议改变 @Html.TextBoxFor(model => model.Hero.Name)@Html.TextBoxFor(**heroName** => **M**odel.Hero.Name)。在语义上它 会更正确吗?可读的。
  3. 你的项目中有_Layout.cshtml吗? 如果是这样,为什么要在AddEdit.cshtml中构造整个HTML? 这样,呈现给浏览器的HTML就变得无效了 某些浏览器不能(不能)解析它。 如果您正在使用_Layout.cshtml,那么除了AddEdit.cshtml中的BODY内容之外,其他内容都会丢失 在_Layout.cshtml
  4. 中做HEAD版本