POST 行动失去价值
POST Action Losing Values
我用 UseCaseId
和 ExtensionPoint
的模型值填充我的视图 - 通过它进行调试似乎工作正常。
但是,当我向视图中的 ExtensionTitle
字段添加一点新信息,然后 POST 时,只有 ExtensionTitle
的值被保留,UseCaseId
和 ExtensionPoint
丢失了。这意味着 if (ModelState.IsValid)
returns false 因此我无法将新记录保存到数据库中。
谁能告诉我为什么在 POST
时这些值会丢失?
VIEWMODEL
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web;
namespace JustSpecIt.ViewModels
{
public class AddExtensionStepViewModel
{
public int UseCaseId { get; set; }
[DisplayName ("Extends Step #")]
public int ExtensionPoint { get; set; }
[DisplayName ("Extends Step Description")]
public string StepTitle { get; set; }
[DisplayName("Extension Name")]
public string ExtensionTitle { get; set; }
}
}
型号
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace JustSpecIt.Models
{
public class Extension
{
public int ID { get; set; }
public int UseCaseID { get; set; }
public string Title { get; set; }
public int ExtensionPoint { get; set; }
}
}
控制器
// GET: Extensions/Create
public ActionResult Create(int id)
{
ViewBag.UseCaseId = id;
ViewBag.StepTitle = db.Steps.Find(id).Content;
//Create an populate the ViewModel
AddExtensionStepViewModel model = new AddExtensionStepViewModel()
{
ExtensionPoint = id,
UseCaseId = db.Steps.Find(id).UseCaseID,
};
return View();
}
// POST: Extensions/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "UseCaseId,ExtensionTitle,ExtensionPoint")] AddExtensionStepViewModel model)
{
if (ModelState.IsValid)
{
Extension e = new Extension ();
e.ExtensionPoint = model.ExtensionPoint;
e.UseCaseID = model.UseCaseId;
e.Title = model.ExtensionTitle;
db.Extensions.Add(e);
db.SaveChanges();
return RedirectToAction("ChooseExtensionStep", new { id = model.UseCaseId });
}
return View(model);
}
VIEW
@model JustSpecIt.ViewModels.AddExtensionStepViewModel
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Add Extension Step</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.UseCaseId)
@Html.HiddenFor(model => model.ExtensionPoint)
<div class="form-horizontal">
<h4>Extension</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.ExtensionTitle, htmlAttributes: new { @class = "control-label col-md-4" })
<div class="col-md-10">
@Html.EditorFor(model => model.ExtensionTitle, new { htmlAttributes = new { @class = "form-control form-control-no-max-width" } })
@Html.ValidationMessageFor(model => model.ExtensionTitle, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
您没有在 GET 方法中将模型传递给视图(因此 UseCaseID
和 Title
的值是 0
(int
的默认值)
public ActionResult Create(int id)
{
ViewBag.UseCaseId = id;
ViewBag.StepTitle = db.Steps.Find(id).Content;
AddExtensionStepViewModel model = new AddExtensionStepViewModel()
{
ExtensionPoint = id,
UseCaseId = db.Steps.Find(id).UseCaseID,
};
return View(model); // change this
}
我用 UseCaseId
和 ExtensionPoint
的模型值填充我的视图 - 通过它进行调试似乎工作正常。
但是,当我向视图中的 ExtensionTitle
字段添加一点新信息,然后 POST 时,只有 ExtensionTitle
的值被保留,UseCaseId
和 ExtensionPoint
丢失了。这意味着 if (ModelState.IsValid)
returns false 因此我无法将新记录保存到数据库中。
谁能告诉我为什么在 POST
时这些值会丢失?
VIEWMODEL
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web;
namespace JustSpecIt.ViewModels
{
public class AddExtensionStepViewModel
{
public int UseCaseId { get; set; }
[DisplayName ("Extends Step #")]
public int ExtensionPoint { get; set; }
[DisplayName ("Extends Step Description")]
public string StepTitle { get; set; }
[DisplayName("Extension Name")]
public string ExtensionTitle { get; set; }
}
}
型号
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace JustSpecIt.Models
{
public class Extension
{
public int ID { get; set; }
public int UseCaseID { get; set; }
public string Title { get; set; }
public int ExtensionPoint { get; set; }
}
}
控制器
// GET: Extensions/Create
public ActionResult Create(int id)
{
ViewBag.UseCaseId = id;
ViewBag.StepTitle = db.Steps.Find(id).Content;
//Create an populate the ViewModel
AddExtensionStepViewModel model = new AddExtensionStepViewModel()
{
ExtensionPoint = id,
UseCaseId = db.Steps.Find(id).UseCaseID,
};
return View();
}
// POST: Extensions/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "UseCaseId,ExtensionTitle,ExtensionPoint")] AddExtensionStepViewModel model)
{
if (ModelState.IsValid)
{
Extension e = new Extension ();
e.ExtensionPoint = model.ExtensionPoint;
e.UseCaseID = model.UseCaseId;
e.Title = model.ExtensionTitle;
db.Extensions.Add(e);
db.SaveChanges();
return RedirectToAction("ChooseExtensionStep", new { id = model.UseCaseId });
}
return View(model);
}
VIEW
@model JustSpecIt.ViewModels.AddExtensionStepViewModel
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Add Extension Step</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.UseCaseId)
@Html.HiddenFor(model => model.ExtensionPoint)
<div class="form-horizontal">
<h4>Extension</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.ExtensionTitle, htmlAttributes: new { @class = "control-label col-md-4" })
<div class="col-md-10">
@Html.EditorFor(model => model.ExtensionTitle, new { htmlAttributes = new { @class = "form-control form-control-no-max-width" } })
@Html.ValidationMessageFor(model => model.ExtensionTitle, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
您没有在 GET 方法中将模型传递给视图(因此 UseCaseID
和 Title
的值是 0
(int
的默认值)
public ActionResult Create(int id)
{
ViewBag.UseCaseId = id;
ViewBag.StepTitle = db.Steps.Find(id).Content;
AddExtensionStepViewModel model = new AddExtensionStepViewModel()
{
ExtensionPoint = id,
UseCaseId = db.Steps.Find(id).UseCaseID,
};
return View(model); // change this
}