以下是我的情景:我有一个名为MaterialPaymentRequest
的模型。它由多个MaterialPaymentRequestSubItem
组成,因此PaymentRequest
是父级,MaterialPaymentRequestSubItem
是其子级。
考虑我有MaterialPaymentRequest
时我想要添加一个孩子。
目前,MaterialPaymentRequestSbuItemController
内的方法如下所示:
public ActionResult CreateChild(int parentId)
{
if (parentId==null)
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
var parenetRequest = (from request in db.MaterialPaymentRequests
where request.Id==parentId
select request);
ViewBag.MaterialPaymentRequestId = new SelectList(parenetRequest, "Id", "Description", parentId);
ViewBag.ParentID = parentId;
return View();
}
我的问题是在视图内部,用户可以更改其父级,因为我有一个下拉列表,我无法将其冻结或只读它:
@Html.DropDownList("MaterialPaymentRequestId", String.Empty)
我尝试使用ViewModel
并在帖子后设置了我的孩子的parentID,但这样我就不知道如何将ParentId传递给http-post控制器方法。
使用ViewMode之前的回发方法是这样的:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateChild([Bind(Include = "Id,Name,Unit,UnitPrice,MaterialPaymentRequestId,Quantity")] MaterialPaymentRequestSubItem materialpaymentrequestsubitem)
{
if (ModelState.IsValid)
{
...
}
....
}
我已经看到使用Html.Hidden
的{{3}}等方法,但我认为它不够安全,因为用户可以在用户端处理信息。
有没有更好的方法来做到这一点?
我可以将信息传递给接受parentID作为参数的控制器,并带有这样的声明吗?
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateChild(int parentID, [Bind(Include = "Id,Name,Unit,UnitPrice,MaterialPaymentRequestId,Quantity")] MaterialPaymentRequestSubItem materialpaymentrequestsubitem)
{
if (ModelState.IsValid)
{
...
}
....
}
答案 0 :(得分:0)
要使HTML帮助器输入控件只在客户端读取,请使用以下命令:
@Html.DropDownList("MaterialPaymentRequestId", String.Empty, new { @readonly = "readonly" })
如果您不想使用客户端隐藏字段,我建议您使用Session变量维护服务器端的parentId内容状态。
Session["parentId"] = parentId;
// just an example to extract Session variable
int parentId = Session["parentId"] != null ? Convert.ToInt32(Session["ParentId"]) : return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
但是,如果您需要视图中的隐藏字段,请在隐藏字段中使用带有验证模式的编码文本(例如Base64或更好的编码),因此访问您网站的任何用户都无法轻易改变其中的值客户端。
查看:
@Html.Hidden("ParentID", @ViewBag.ParentID);
// or if you have a viewmodel, pass viewmodel's value here
@Html.HiddenFor(model => model.ParentID);
控制器方法:
public ActionResult CreateChild(int parentId)
{
...
// convert parentId into Base64
ViewBag.ParentID = Convert.ToBase64String(parentId);
return View(ViewBag); // model binding
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateChild([Bind(Include = "Id,Name,Unit,UnitPrice,MaterialPaymentRequestId,Quantity,ParentID")] MaterialPaymentRequestSubItem materialpaymentrequestsubitem)
{
...
// get Parent ID
int parentId = (int)Convert.FromBase64String(ParentID);
// write your own algorithm to validate hidden field's value
...
if (ModelState.IsValid)
{
// redirect to create child elements
return RedirectToAction("CreateChild", "Controller", new { @id = parentId });
}
}
希望这个解释对您有用,CMIIW。